考虑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?
答案 0 :(得分:2)
Prob需要通过所有案例,但这里有一些经验法则(假设在DataFrame上进行分组):
如果您通过dict
或list
申请,您将逐项收料,IOW,您将获得Series
以字符串形式传递的单个聚合器(例如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)