Создайте 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-м вызовах?
Приносим извинения за ошибки,






Проблема здесь:
c_str = X.c.tolist[0]
pd.Series.tolist - это метод. Для вызова метода используйте круглые скобки:
c_str = X.c.tolist()[0]
Также, конечно, убедитесь, что вы определили y.
Еще он возвращает y, который появляется из ниоткуда.
Согласитесь, что вопрос непонятный. Ошибка также возникает при предложенном вами изменении. Если бы проблема была вызвана вызовом функции, он бы получил TypeError, «объект функции не подлежит подписке»
@ user3483203, Странно, у меня отлично работает на Pandas v0.23.0 / Python 3.6.5. Вы получаете обычную первую группу, пройденную дважды (из-за того, как работает groupby + apply), но в остальном ошибок нет.
@ user3483203, попробуйте return None или return 1 вместо return y. Если определен y, ошибки не возникает. Я думаю, что там какая-то странная логика обработки ошибок Pandas.
Я постараюсь ответить на ваш вопрос, но сначала я вижу несколько проблем с вашим сообщением, поэтому я хотел бы указать на них:
fun НЕ определяет переменную, которую вы пытаетесь вернуть: y.Согласно вашему вопросу, вы хотите использовать функцию применения для каждой строки в C, но группировка по c может удалить некоторые строки. Итак, вы можете попробовать
def fun(X):
return X.c.tolist()[0]
x_df1 = x_df['c'].apply(fun)
Но проблему можно решить и лучше. Вместо передачи сгруппированного объекта вы можете просто передать вектор-столбец:
x_df1 = x_df['c'].apply(fun)
Однако, если бы мы знали исходную проблему, которую вы пытаетесь решить, я бы порекомендовал применить лямбда-вызов:
x_df1 = x_df['c'].apply(lambda x: list(x))
Я использовал list(), но его следует заменить на то, что вы пытаетесь сделать.
У вас есть синтаксические ошибки повсюду в вашем вопросе