Python 使用自定义函数对groupby的结果应用时,不会传递所有列
创建一个数据帧Python 使用自定义函数对groupby的结果应用时,不会传递所有列,python,pandas,apply,pandas-groupby,Python,Pandas,Apply,Pandas 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']}) 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”的每个值使用一个函数。因此,我对groupby的结果使用a
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”的每个值使用一个函数。因此,我对groupby
的结果使用apply()
函数
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'
---------------------------------------------------------------
===============>>>>>>>>>>>>>>>>>>>>>
['a','b','c']
===============>>>>>>>>>>>>>>>>>>>>>
['a','b','c']
===============>>>>>>>>>>>>>>>>>>>>>
**['a','b']**
===============>>>>>>>>>>>>>>>>>>>>>
**['a','b']**
回溯(最近一次呼叫最后一次):
文件“”,第12行,在
x_df1=x_df.groupby('c')。应用(fun)。重置索引()
文件“C:\ProgramData\Anaconda3\lib\site packages\pandas\core\groupby\groupby.py”,第930行,在apply中
返回self.\u python\u apply\u general(f)
文件“C:\ProgramData\Anaconda3\lib\site packages\pandas\core\groupby\groupby.py”,第936行,在python\u apply\u general中
自平衡轴)
文件“C:\ProgramData\Anaconda3\lib\site packages\pandas\core\groupby\groupby.py”,第2273行,在apply中
res=f(组)
文件“”,第6行,有趣
c_str=X.c.tolist[0]
文件“C:\ProgramData\Anaconda3\lib\site packages\pandas\core\generic.py”,第4376行,在\uuu getattr中__
返回对象。\uuuGetAttribute(self,name)
AttributeError:“DataFrame”对象没有属性“c”
因此,函数funx的前两个调用中的包含所有三列(应该是这样),但在第三和第四个调用列中,缺少
c
。因此我无法访问它。有人能告诉我我做错了什么,为什么在第三次和第四次通话中没有列c
问题在于:
c_str = X.c.tolist[0]
这是一种方法。要调用方法,请使用括号:
c_str = X.c.tolist()[0]
当然,还要确保你定义了
y
我会尝试回答你的问题,但首先我发现你的帖子有一些问题,所以我想指出:
fun
函数没有定义您试图返回的变量:y
C
分组可能会删除一些行。所以,你可以试试
def fun(X):
return X.c.tolist()[0]
x_df1 = x_df['c'].apply(fun)
但这个问题可以用更好的方法解决。您可以只传递列向量,而不是传递分组对象:
x_df1 = x_df['c'].apply(fun)
但是,如果我们知道您试图解决的初始问题,那么我建议您使用apply lambda调用:
x_df1 = x_df['c'].apply(lambda x: list(x))
我使用了
list()
,但这应该被你正在尝试做的事情所取代。你的问题中到处都是语法错误。抱歉,他还返回了y
,不知从何而来。同意问题不清楚。您建议的更改仍然会发生错误。如果函数调用是一个问题,那么他会得到一个类型错误
,“函数对象不可下标”@user3483203,奇怪的是,它在Pandas v0.23.0/Python 3.6.5上对我来说很好。通常第一组被传递了两次(因为groupby
+apply
的工作方式),但在其他方面没有错误。也许在0.23中引入了一些东西。4@user3483203,尝试返回无
或返回1
而不是返回y
。如果定义了y
,则不会发生错误。我想有些奇怪的错误处理逻辑。