Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用自定义函数对groupby的结果应用时,不会传递所有列_Python_Pandas_Apply_Pandas Groupby - Fatal编程技术网

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中的每一行使用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()
    ,但这应该被你正在尝试做的事情所取代。

    你的问题中到处都是语法错误。抱歉,他还返回了
    y
    ,不知从何而来。同意问题不清楚。您建议的更改仍然会发生错误。如果函数调用是一个问题,那么他会得到一个
    类型错误
    ,“函数对象不可下标”@user3483203,奇怪的是,它在Pandas v0.23.0/Python 3.6.5上对我来说很好。通常第一组被传递了两次(因为
    groupby
    +
    apply
    的工作方式),但在其他方面没有错误。也许在0.23中引入了一些东西。4@user3483203,尝试
    返回无
    返回1
    而不是
    返回y
    。如果定义了
    y
    ,则不会发生错误。我想有些奇怪的错误处理逻辑。