Все столбцы не передаются, когда мы используем apply для результата groupby с пользовательской функцией - PullRequest
0 голосов
/ 10 декабря 2018

Создать DataFrame,

x_df = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': [1,2,1,2,1,2],
                     'c': ['x','x','y','y','z','z']})

Out[56]: 
   a  b  c
0  1  1  x
1  2  2  x
2  3  1  y
3  4  2  y
4  5  1  z
5  6  2  z

Теперь я хочу использовать функцию для каждого значения столбца 'c'.Поэтому я использую функцию apply() для результата groupby.

x_df = pd.DataFrame({'a': [1,2,3,4,5,6], 'b': [1,2,1,2,1,2], 'c': ['x','x','y','y','z','z']})

def fun(X):
    print("===============>>>>>>>>>>>>>>>>>>>>> ")
    print(list(X))
    print("\n")
    c_str = X.c.tolist[0]
    print("Value of c_str ==========>>> "+ str(c_str))
    return y


x_df1 = x_df.groupby('c').apply(fun).reset_index()

Выполнение кода выше дает следующий результат:

---------------------------------------------------------------
===============>>>>>>>>>>>>>>>>>>>>> 
['a', 'b', 'c']


===============>>>>>>>>>>>>>>>>>>>>> 
['a', 'b', 'c']


===============>>>>>>>>>>>>>>>>>>>>> 
**['a', 'b']**


===============>>>>>>>>>>>>>>>>>>>>> 
**['a', 'b']**


Traceback (most recent call last):

  File "<ipython-input-20-6870c2554589>", line 12, in <module>
    x_df1 = x_df.groupby('c').apply(fun).reset_index()

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 930, in apply
    return self._python_apply_general(f)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 936, in _python_apply_general
    self.axis)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 2273, in apply
    res = f(group)

  File "<ipython-input-20-6870c2554589>", line 6, in fun
    c_str = X.c.tolist[0]

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 4376, in __getattr__
    return object.__getattribute__(self, name)

AttributeError: 'DataFrame' object has no attribute 'c'

Итак, вПервые два вызова функции fun X имеют все три столбца (что и должно быть), но в 3-м и 4-м столбцах вызовов c отсутствует.из-за которого я не могу получить к нему доступ.Может кто-нибудь подсказать мне, что я делаю неправильно и почему столбец c отсутствует на 3-м и 4-м вызовах?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Я постараюсь ответить на ваш вопрос, но сначала я вижу несколько проблем с вашим постом, поэтому я хотел бы указать на них:

  1. Ваше форматирование испорчено и делает его очень труднымчтобы прочитать ваш код.
  2. Ваша функция fun НЕ определяет переменную, которую вы пытаетесь вернуть: y.
  3. Ваш вопрос НЕ объясняет, в чем заключается исходная проблема.Вы спрашиваете, как ваш код неправильный вместо правильного способа решения вашей проблемы.

В соответствии с вашим вопросом, вы хотите использовать функцию apply для каждой строки в C, но группируя по cможет удалить несколько строк.Итак, вы можете попробовать

def fun(X):
    return X.c.tolist()[0]

x_df1 = x_df['c'].apply(fun)

Но проблему можно решить лучше.Вместо прохождения сгруппированного объекта вы можете просто передать вектор столбца:

x_df1 = x_df['c'].apply(fun)

Однако, если бы мы знали первоначальную проблему, которую вы пытаетесь решить, я бы порекомендовал применить лямбда-вызов apply:

x_df1 = x_df['c'].apply(lambda x: list(x))

Я использовал list(), но это должно быть заменено тем, что вы пытаетесь сделать.

0 голосов
/ 10 декабря 2018

Проблема здесь:

c_str = X.c.tolist[0]

pd.Series.tolist - это метод.Для вызова метода используйте круглые скобки:

c_str = X.c.tolist()[0]

Также, конечно, убедитесь, что вы определили y.

...