PythonPandas:如何使用返回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

我有一个多索引数据帧,我想在它上面聚合一些索引。如果聚合器函数返回一个浮点值,那么一切都不会有问题。但我找不到如何使用返回更复杂的函数(例如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,
    },
    '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