什么时候df.groupby(...)。agg(myagg)将一个系列传递给myagg?

时间:2013-06-13 22:03:52

标签: pandas

考虑DataFrame:

import pandas as pd
df = pd.DataFrame({'A':[1,2,1,2],
                   'B':[1,2,1,2],
                   'C':list('WXYZ'),
                   'D':list('abcd')})
df.set_index('A', inplace=True)
print(df)
#    B  C  D
# A         
# 1  1  W  a
# 2  2  X  b
# 1  1  Y  c
# 2  2  Z  d

def myagg(x):
    print(type(x).__name__)
    print(x)

通常,df.groupby(...).agg(myagg)会将(子)DataFrame传递给 myagg。例如,

df.groupby(level=0).agg(myagg)
# DataFrame
#    B  C  D
# A         
# 1  1  W  a
# 1  1  Y  c
# DataFrame
#    B  C  D
# A         
# 2  2  X  b
# 2  2  Z  d

但是,如果使用多级索引,则myagg将传递给Series:

df2 = df.set_index(['B'], append=True)
df2.groupby(level=['A','B']).agg(myagg)
# Series
# A  B
# 1  1    W
#    1    Y
# Name: C
# Series
# A  B
# 2  2    X
#    2    Z
# Name: C
# Series
# A  B
# 1  1    a
#    1    c
# Name: D
# Series
# A  B
# 2  2    b
#    2    d
# Name: D

有时这可能非常有用,但我想更好地理解 agg何时将单列(系列)传递给myagg,以及何时通过 整个DataFrames?

1 个答案:

答案 0 :(得分:2)

Prob需要通过所有案例,但这里有一些经验法则(假设在DataFrame上进行分组):

  • 如果您通过dictlist申请,您将逐项收料,IOW,您将获得Series

    < / LI>
  • 以字符串形式传递的单个聚合器(例如mean,sum)将作为 DataFrame(您实际上会在不同的dtyped块上多次调用)

  • 传递函数,与单字符串聚合器

  • 相同

现在为了问题。

如果传递的函数爆炸(意味着引发TypeError),这意味着它将逐项进行(因此您将获得Series

我相信如果只有一个小组,你会得到一个DataFrame,但如果有什么东西爆炸,我会再次逐项退回。

回答unutbu问题:

当拥有多个密钥(例如第二个示例)时,默认是使用具有多索引的系列进行聚合,而单个密钥将进行数据框聚合(取决于我的上述问题)

pandas / core / groupby.py

中的第1745行
   if self.grouper.nkeys > 1:
        return self._python_agg_general(arg, *args, **kwargs)
    else:
        result = self._aggregate_generic(arg, *args, **kwargs)