创建一个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'的每个值上使用一个函数 . 所以我在 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'
因此,函数fun X的前两个调用中包含所有三列(应该是这种情况),但是在第3和第4个调用列中缺少 c
. 因为我无法访问它 . 有人可以指导我做错了什么以及为什么第3和第4个电话上没有列 c
?
2 回答
问题出在这里:
pd.Series.tolist是一种方法 . 要调用方法,请使用括号:
当然,还要确保定义
y
.我会尝试回答你的问题,但首先我发现你的帖子有一些问题,所以我想指出它们:
您的格式混乱,使您很难阅读代码 .
您的
fun
函数未定义您要返回的变量:y
.您的问题没有解释最初的问题是什么 . 您问的是您的代码是如何错误的,而不是正确的方法来解决您的问题 .
根据您的问题,您希望对C中的每一行使用apply函数,但按
c
分组可能会删除一些行 . 所以,你可以试试但问题可以通过更好的方式解决 . 您可以只传递列向量,而不是传递分组对象:
但是,如果我们知道您要解决的初始问题,那么我建议应用lambda调用:
我使用
list()
,但应该用你想要的东西替换 .