首页 文章

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

提问于
浏览
2

创建一个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 回答

  • 1

    问题出在这里:

    c_str = X.c.tolist[0]
    

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

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

    当然,还要确保定义 y .

  • 1

    我会尝试回答你的问题,但首先我发现你的帖子有一些问题,所以我想指出它们:

    • 您的格式混乱,使您很难阅读代码 .

    • 您的 fun 函数未定义您要返回的变量: y .

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

    根据您的问题,您希望对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)
    

    但是,如果我们知道您要解决的初始问题,那么我建议应用lambda调用:

    x_df1 = x_df['c'].apply(lambda x: list(x))
    

    我使用 list() ,但应该用你想要的东西替换 .

相关问题