Python-熊pandasGroupBy.apply方法复制第一个组

发布于 2021-02-02 23:14:36

我的第一个SO问题:我对在熊猫(0.12.0-4)中groupby的apply方法的这种行为感到困惑,它似乎将TWICE函数应用于数据帧的第一行。例如:

>>> from pandas import Series, DataFrame
>>> import pandas as pd
>>> df = pd.DataFrame({'class': ['A', 'B', 'C'], 'count':[1,0,2]})
>>> print(df)
   class  count  
0     A      1  
1     B      0    
2     C      2

我首先检查groupby函数是否可以正常工作,这似乎很好:

>>> for group in df.groupby('class', group_keys = True):
>>>     print(group)
('A',   class  count
0     A      1)
('B',   class  count
1     B      0)
('C',   class  count
2     C      2)

然后,我尝试对groupby对象应用apply来执行类似的操作,并且两次获得第一行输出:

>>> def checkit(group):
>>>     print(group)
>>> df.groupby('class', group_keys = True).apply(checkit)
  class  count
0     A      1
  class  count
0     A      1
  class  count
1     B      0
  class  count
2     C      2

任何帮助,将不胜感激!谢谢。

编辑:@Jeff提供以下答案。我很忙,并没有立即理解它,因此,这是一个简单的示例,显示尽管上面的示例中第一组的两次打印输出,apply方法仅对第一组操作一次,并且不会改变原始数据帧:

>>> def addone(group):
>>>     group['count'] += 1
>>>     return group

>>> df.groupby('class', group_keys = True).apply(addone)
>>> print(df)

      class  count
0     A      1
1     B      0
2     C      2

但是通过将方法的返回值分配给新对象,我们看到它可以按预期工作:

df2 = df.groupby('class',group_keys = True).apply(addone)print(df2)

      class  count
0     A      2
1     B      1
2     C      3
关注者
0
被浏览
70
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    该apply功能需要知道返回数据的形状,以智能地确定如何将其组合。为此,它将调用函数checkit两次(以你的情况为准)以实现此目的。

    根据你的实际使用情况,你可以取代呼叫applyaggregatetransformfilter,如详细说明这里。这些函数要求返回值必须是特定的形状,因此不要两次调用该函数。

    但是-如果你正在调用的函数没有副作用,那么在第一个值上两次调用该函数就很可能无关紧要。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看