Python Pandas GroupBy.apply方法复制第一个组

Python Pandas GroupBy.apply方法复制第一个组,python,pandas,group-by,pandas-groupby,Python,Pandas,Group By,Pandas Groupby,我的第一个问题是: 我对pandas(0.12.0-4)中groupby的apply方法的这种行为感到困惑,它似乎对数据帧的第一行应用了两次函数。例如: >>> from pandas import Series, DataFrame >>> import pandas as pd >>> df = pd.DataFrame({'class': ['A', 'B', 'C'], 'count':[1,0,2]}) >>> p

我的第一个问题是: 我对pandas(0.12.0-4)中groupby的apply方法的这种行为感到困惑,它似乎对数据帧的第一行应用了两次函数。例如:

>>> 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

这是通过设计实现的,如所述和

apply
函数需要知道返回数据的形状,以便智能地确定如何组合这些数据。要做到这一点,它会调用函数两次(在您的例子中是checkit)

根据您的实际用例,您可以将对
apply
的调用替换为
aggregate
transform
filter
,如详细所述。这些函数要求返回值是特定的形状,因此不要调用函数两次


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

您可以使用for循环来避免groupby。应用重复的第一行

log_sample.csv

guestid,keyword
1,null
2,null
2,null
3,null
3,null
3,null
4,null
4,null
4,null
4,null
我的代码剪了

df=pd.read_csv("log_sample.csv") 
grouped = df.groupby("guestid")

for guestid, df_group in grouped:
    print(list(df_group['guestid'])) 

df.head(100)
输出

[1]
[2, 2]
[3, 3, 3]
[4, 4, 4, 4]
此“问题”现已修复:升级到0.25+ 从v0.25开始,
GroupBy.apply()。看

文件中的相关示例:

pd.__version__                                                                                                          
# '0.25.0.dev0+590.g44d5498d8'

df = pd.DataFrame({"a": ["x", "y"], "b": [1, 2]})                                                                      

def func(group): 
    print(group.name) 
    return group                                                                                                                     
新行为(>=v0.25):


旧行为(从v0.25开始,行为将发生变化,因此第一组仅评估一次。。请更新接受的答案,因为旧答案不再有效。哦,因此基本上熊猫仍将在第一行运行两次
apply
。此修复仅适用于groupby.apply.dam中的组。@cmcdragokai现在.apply
。熊猫的哪个版本?
df.groupby('a').apply(func)                                                                                            
x
y

   a  b
0  x  1
1  y  2
df.groupby('a').apply(func)
x
x
y

   a  b
0  x  1
1  y  2