微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas GroupBy.apply方法重复第一组

我的第一个问题:
我对pandas(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

解决方法:

这是设计的,如here here所述

apply函数需要知道返回数据的形状,以智能地确定它将如何组合.为此,它会调用函数(在您的情况下为checkit)两次来实现此目的.

根据您的实际用例,您可以使用聚合,转换或过滤替换要应用的调用,如详细说明here所述.这些函数要求返回值为特定形状,因此不要将函数调用两次.

但是 – 如果您调用函数没有副作用,则很可能在第一个值上调用函数两次并不重要.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐