Pythonpandasgroupby对象apply方法复制第一组

我的第一个SO问题:我对groupby的apply方法在pandas(0.12.0-4)中的这种行为感到困惑,它似乎将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对象进行类似的操作,并得到第一行输出两次:

 >>> 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提供了下面的答案。 我很密集,并且不能马上理解,所以这里有一个简单的例子来说明,尽pipe在上面的例子中,第一组的double打印输出,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 

这是devise,如这里和这里所述

apply函数需要知道返回的数据的形状,以智能地找出它将如何组合。 要做到这一点,它调用函数( checkit您的情况)两次,以实现这一目标。

根据您的实际使用情况,您可以使用aggregatetransformfilterreplace要apply的调用,如此处所述。 这些函数要求返回值是一个特定的形状,所以不要两次调用函数。

但是,如果您正在调用的函数没有副作用,那么函数在第一个值上被调用两次可能并不重要。

Interesting Posts