猿问

当我们使用自定义函数对 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']})


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 次调用中没有列?


月关宝盒
浏览 284回答 2
2回答

慕码人2483693

问题在这里:c_str&nbsp;=&nbsp;X.c.tolist[0]pd.Series.tolist是一种方法。要调用方法使用括号:c_str&nbsp;=&nbsp;X.c.tolist()[0]另外,当然,请确保您定义了y.

慕桂英546537

我会尽量回答你的问题,但首先我看到你的帖子有一些问题,所以我想指出它们:你的格式搞砸了,很难阅读你的代码。您的fun函数未定义您尝试返回的变量:y。你的问题没有解释最初的问题是什么。您在问您的代码是如何错误的,而不是解决问题的正确方法。根据您的问题,您想对 C 中的每一行使用 apply 函数,但分组依据c可能会删除一些行。所以,你可以试试def fun(X):&nbsp; &nbsp; 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()但应该用你想要做的来代替。
随时随地看视频慕课网APP

相关分类

Python
我要回答