PythonPandas:如何使用返回pd.Series的函数进行分组聚合
我有一个多索引数据帧,我想在它上面聚合一些索引。如果聚合器函数返回一个浮点值,那么一切都不会有问题。但我找不到如何使用返回更复杂的函数(例如pd系列)。使用返回pd.Series的函数会产生以下错误:PythonPandas:如何使用返回pd.Series的函数进行分组聚合,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个多索引数据帧,我想在它上面聚合一些索引。如果聚合器函数返回一个浮点值,那么一切都不会有问题。但我找不到如何使用返回更复杂的函数(例如pd系列)。使用返回pd.Series的函数会产生以下错误:异常:必须生成聚合值错误 以下是一个数据帧示例: df = pd.DataFrame({ 'A': { (1, 0): 85, (1, 1): 75, (2, 0): 12, (2, 1): 15, (3, 0): 2, (3, 1): 26
异常:必须生成聚合值
错误
以下是一个数据帧示例:
df = pd.DataFrame({
'A': {
(1, 0): 85, (1, 1): 75,
(2, 0): 12, (2, 1): 15,
(3, 0): 2, (3, 1): 26,
},
'B': {
(1, 0): 86, (1, 1): 76,
(2, 0): 13, (2, 1): 17,
(3, 0): 19, (3, 1): 18,
}
}).stack()
df.index.rename(['idx', 'bar', 'label'], inplace=True)
df
的内容是:
idx bar label
1 0 A 85
B 86
1 A 75
B 76
2 0 A 12
B 13
1 A 15
B 17
3 0 A 2
B 19
1 A 26
B 18
dtype: int64
让我们定义一个返回pd.Series的简单聚合器:
def my_func(subframe):
subframe = subframe.unstack('label')
mean_A_plus_B = np.mean(subframe['B'] + subframe['A'])
mean_A_minus_B = np.mean(subframe['B'] - subframe['A'])
return pd.Series([mean_A_plus_B, mean_A_minus_B], index=['A+B', 'A-B'])
# return mean_A_plus_B ## <- this one works.
我希望得到的是:
A+B A-B
idx
1 161.0 1.0
2 28.5 1.5
3 32.5 4.5
dtype: float64
正确的方法是什么?只需将.agg()
替换为.apply()
:
输出:
A+B A-B
idx
1 161.0 1.0
2 28.5 1.5
3 32.5 4.5
现在我有一个后续问题。
.agg()
方法可以根据文档接收列名->函数(或函数列表)的dict。看起来,apply
没有这样的功能。我的用例是,我有一堆特定于列的处理,我想在数据帧上运行。我想把{'col1':func_a,'col2':func_b,…}
类型参数传递给它。你知道有没有解决办法吗?你也可以用.apply()
来解决这个问题,方法是处理my_func
中的不同列,然后返回一个数据帧,而不是一个序列
df.groupby('idx').apply(my_func).unstack(level=-1)
A+B A-B
idx
1 161.0 1.0
2 28.5 1.5
3 32.5 4.5