为了账号安全,请及时绑定邮箱和手机立即绑定

当我们使用自定义函数对 groupby 的结果使用 apply 时,不会传递所有列

当我们使用自定义函数对 groupby 的结果使用 apply 时,不会传递所有列

月关宝盒 2021-09-11 19:49:04
创建一个数据框,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  c0  1  1  x1  2  2  x2  3  1  y3  4  2  y4  5  1  z5  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 yx_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 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

问题在这里:

c_str = X.c.tolist[0]

pd.Series.tolist是一种方法。要调用方法使用括号:

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

另外,当然,请确保您定义了y.


查看完整回答
反对 回复 2021-09-11
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

我会尽量回答你的问题,但首先我看到你的帖子有一些问题,所以我想指出它们:

  1. 你的格式搞砸了,很难阅读你的代码。

  2. 您的fun函数未定义您尝试返回的变量:y

  3. 你的问题没有解释最初的问题是什么。您在问您的代码是如何错误的,而不是解决问题的正确方法。

根据您的问题,您想对 C 中的每一行使用 apply 函数,但分组依据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()但应该用你想要做的来代替。


查看完整回答
反对 回复 2021-09-11
  • 2 回答
  • 0 关注
  • 253 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号