首页 > 解决方案 > 根据多个 groupby 计算总和

问题描述

我有一个 df 和一个 dict 如下:-

    dict_min_count = {'A':1,'B':4,'C':2,'D':3}

    df:-
    
    mac_type Test  time_diff
    1        A     567
    1        B     2
    1        B     6
    1        B     8
    1        B     9
    1        B     8
    1        C     99
    1        D     1
    1        D     2
    1        D     10
    1        D     1
    2        A     2
    2        A     12
    2        A     21
    2        B     22
    2        B     12
    2        C     2
    2        C     3
    2        D     1
    2        D     3
    2        D     12
    2        D     12

通过使用这两个数据,我需要使用一些条件来计算总和:1)对于 mac_type 的任何测试,我只需要计算 dict_min_count 字典中存在的前 n 行的总和。

示例:对于测试 A,无需计算总和,因为值为 1。对于每个 mac_type 的测试 B,计算 4 行的总和。如果没有 4 行,则计算其中的条目数(在 mac_type 2 的情况下,机器 B 只有 2 个条目,因此总和仅适用于那 2 行)

我正在查看的最终结果如下:

              Tests
    mac_type  A      B          C         D
    1         567 (2+6+8+9)     99     (1+2+10)
    2         2   (12+22)      (2+3)  (1+3+12)

标签: pythonpandas

解决方案


使用自定义函数与Series.head字典匹配值 thensum和 last Series.unstackfor DataFrame

dict_min_count = {'A':1,'B':4,'C':2,'D':3}

df = (df.groupby(['mac_type','Test'])['time_diff']
        .apply(lambda x: x.head(dict_min_count[x.name[1]]).sum())
        .unstack())
print (df)
Test        A   B   C   D
mac_type                 
1         567  25  99  13
2           2  34   5  16

推荐阅读