我的第一个问题:我对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
2 回答
这是设计的,如here和here所述
apply
函数需要知道返回数据的形状,以智能地确定它将如何组合 . 为此,它会调用函数(在您的情况下为checkit
)两次来实现此目的 .根据您的实际用例,您可以将
apply
的调用替换为aggregate
,transform
或filter
,详见here . 这些函数要求返回值为特定形状,因此不要将函数调用两次 .但是 - 如果你调用的函数没有副作用,那么在第一个值上调用函数很可能并不重要 .
你可以使用for循环来避免groupby.apply复制第一行,
log_sample.csv
我的代码snippit
产量