Pandas嵌套groupby并基于另一列对唯一值求和

toiithl6  于 2023-03-21  发布在  其他
关注(0)|答案(2)|浏览(130)

我有一个Pandas数据框

import pandas as pd
import numpy as np

data = pd.DataFrame({"ID1": ["a", "a", "a", "b", "b", "b", "c", "c", "c"],
                     "ID2": ["k", "k", "k", "k","k", "k", "j", "j", "j"],
                     "val": [18, 19, 20, 18, 19, 20, 34, 35, 37]
                     })

data
  • 输出:*
ID1 ID2 val
0   a   k   18
1   a   k   19
2   a   k   20
3   b   k   18
4   b   k   19
5   b   k   20
6   c   j   34
7   c   j   35
8   c   j   37

我尝试通过按ID1分组来获得val的平均值,最终需要按ID2分组的sum

(data
 .assign(val_id1_avg = data.groupby("ID1")["val"].transform("mean"))
 .groupby("ID2")
 .agg(val_avg = ("val_id1_avg", lambda x: np.sum(x.unique())),
      volume=("ID1", 'nunique'))
 .reset_index())
  • 输出:*
ID2  val_avg volume
0   j   35.333333   1
1   k   19.000000   2

如何删除基于ID1的重复项并对val_id1_avg求和?

所需输出:

ID2 val_avg    Volume
0   k   38.00   1
1   j   35.33   2
zte4gxcn

zte4gxcn1#

您可以尝试按两个ID分组来计算平均值,然后按第二个ID分组并使用sum:

(data.groupby(["ID1", 'ID2'])["val"].mean()).groupby(['ID2']).sum()

输出:

ID2
j    35.333333
k    38.000000
Name: val, dtype: float64
dced5bon

dced5bon2#

这里是技巧,替换重复的ID1val_id1_avgSeries.maskSeries.duplicated

df = (data.assign(val_id1_avg = data.groupby("ID1")["val"].transform("mean").mask(data['ID1'].duplicated()))
          .groupby("ID2", as_index=False, sort=False)
          .agg(val_avg = ("val_id1_avg",'sum'),
               volume=("ID1", 'nunique'))
         )

print (df)
  ID2    val_avg  volume
0   k  38.000000       2
1   j  35.333333       1

详细信息

print (data.assign(val_id1_avg = data.groupby("ID1")["val"].transform("mean").mask(data['ID1'].duplicated()))
          )

  ID1 ID2  val  val_id1_avg
0   a   k   18    19.000000
1   a   k   19          NaN
2   a   k   20          NaN
3   b   k   18    19.000000
4   b   k   19          NaN
5   b   k   20          NaN
6   c   j   34    35.333333
7   c   j   35          NaN
8   c   j   37          NaN

相关问题