Pandas groupby 并跨行应用聚合函数

glp*_*psx 1 python group-by pandas

groupby我在将海关功能应用于熊猫操作时遇到困难。假设我有以下 DataFrame 可以使用:

import pandas as pd

df = pd.DataFrame(
    {
        "id": [1, 1, 2, 2],
        "flag": ["A", "A", "B", "B"],
        "value1": [520, 250, 180, 360],
        "value2": [11, 5, 7, 2],
    }
)

print(df)

   id flag  value1  value2
0   1    A     520      11
1   1    A     250       5
2   2    B     180       7
3   2    B     360       2
Run Code Online (Sandbox Code Playgroud)

我需要对上面的 DataFrame 应用 4 个聚合函数,按id和分组flag。具体来说,对于每个idflag

  1. 计算 的平均值value1
  2. 计算总和value2
  3. 计算 的平均值(value1 * value2) / 12
  4. 计算 的总和(value1 / value2)

我对前两个没有任何问题。这就是我计算它们的方法:

df.groupby(["id", "flag"]).agg({"value1": ["mean"], "value2": ["sum"]})

        value1 value2
          mean    sum
id flag              
1  A     385.0     16
2  B     270.0      9
Run Code Online (Sandbox Code Playgroud)

我的问题与最后两个聚合有关。我在这里搜索类似的问题,我认为我需要创建两个自定义函数并将它们应用到对象groupby。不幸的是,我所有的尝试都失败了,我无法解决这个问题。另外,如果可能的话,我希望所有结果都在一个 DataFrame 中,如下所示(希望我已经正确计算了数字):

        value1 value2
          mean    sum     func1     func2
id flag              
1  A     385.0     16    290.42     97.27
2  B     270.0      9      82.5    205.71
Run Code Online (Sandbox Code Playgroud)

Qua*_*ang 5

groupby().agg.只接受一列的值。

对于涉及多个列的自定义函数,我会这样做:

groupby = df.groupby(['id','flag'])

out = pd.DataFrame({
    'value1': groupby['value1'].mean(),
    'value2': groupby['value2'].sum(),
    'value3': groupby.apply(lambda x: (x['value1'] * x['value2']).mean()/12),
    'value4': groupby.apply(lambda x: (x['value1']/x['value2']).sum())
})
Run Code Online (Sandbox Code Playgroud)

输出:

         value1  value2      value3      value4
id flag                                        
1  A        385      16  290.416667   97.272727
2  B        270       9   82.500000  205.714286
Run Code Online (Sandbox Code Playgroud)