3 级 pandas grupby 对象上的聚合函数

Aggregate functions on a 3-level pandas grupby object

我想创建一个新的 df,其中包含在下面可见的 df 中的值列上计算的平均值、总和、最小值、最大值等简单指标,并按 ID、日期和键分组。

index ID Key Date Value x y z
0 655 321 2021-01-01 50 546 235 252345
1 675 321 2021-01-01 50 345 345 34545
2 654 356 2021-02-02 70 345 346 543

我是这样做的:

final = df.groupby(['ID','Date','Key'])['Value'].first().mean(level=[0,1]).reset_index().rename(columns={'Value':'Value_Mean'})

我使用 .first() 是因为一个 Key 可以在 df 中出现多次,但它们都具有相同的 Value。我想聚合 ID 和日期,所以我使用 level=[0,1].

然后我添加下一个指标 pandas merge as:

final = final.merge(df.groupby(['ID','Date','Key'])['Value'].first().max(level=[0,1]).reset_index().rename(columns={'Value':'Value_Max'}), on=['ID','Date'])

我对其他指标也是如此。我想知道是否有比在多行中重复它更复杂的方法来做到这一点。我知道您可以使用 .agg() 并传递带有函数的字典,但似乎无法指定此处重要的级别。

使用DataFrame.drop_duplicates with named aggregation:

df = pd.DataFrame({'ID':[655,655,655,675,654], 'Key':[321,321,333,321,356], 
                  'Date':['2021-01-01','2021-01-01','2021-01-01','2021-01-01','2021-02-02'],
                   'Value':[50,30,10,50,70]})
print (df)
    ID  Key        Date  Value
0  655  321  2021-01-01     50
1  655  321  2021-01-01     30
2  655  333  2021-01-01     10
3  675  321  2021-01-01     50
4  654  356  2021-02-02     70

final = (df.drop_duplicates(['ID','Date','Key'])
           .groupby(['ID','Date'], as_index=False).agg(Value_Mean=('Value','mean'),
                                                       Value_Max=('Value','max')))
print (final)
    ID        Date  Value_Mean  Value_Max
0  654  2021-02-02          70         70
1  655  2021-01-01          30         50
2  675  2021-01-01          50         50

final = (df.groupby(['ID','Date','Key'], as_index=False)
           .first()
           .groupby(['ID','Date'], as_index=False).agg(Value_Mean=('Value','mean'),
                                                       Value_Max=('Value','max')))

print (final)
    ID        Date  Value_Mean  Value_Max
0  654  2021-02-02          70         70
1  655  2021-01-01          30         50
2  675  2021-01-01          50         50

df = (df.groupby(['ID','Date','Key'], as_index=False)
      .first()
        .groupby(['ID','Date'], as_index=False)['Value']
        .agg(['mean', 'max'])
        .add_prefix('Value_')
        .reset_index())
print (df)
    ID        Date  Value_Mean  Value_Max
0  654  2021-02-02          70         70
1  655  2021-01-01          30         50
2  675  2021-01-01          50         50