Python熊猫-数据框通过pd.groupby()。agg()

时间:2020-06-11 11:26:57

标签: python pandas numpy aggregate

我有一个DF [命名为cleanData],其中包含一些值和2列,分别是custom_critirea和total_count。

这是我的DF的一部分:

     CUSTOM_CRITERIA  TOTAL_CODE_SERVED_COUNT
8            2768012                       27
9            3307322                        1
10           3270374                        2
11           3353569                        4
12           3423432                      660
13           1737751                        0
14           3564415                        5
15           3593988                        1
16           3593981                        2
17           3603423                    48367
18           3483162                        6
19           3603380                        3
20           3483062                        2
21           3617505                     2363
22           3617633                       11
23           3607897                        7
24           3619532                        1
28           3633518                        3
29           3653760                       22
30           3653625   ...

我现在拥有的是:

aggMap = {'TOTAL_CODE_SERVED_COUNT': ['sum', 'max']}
cleanData = cleanData.groupby('CUSTOM_CRITERIA').agg(aggMap)

这给了我每个定制标准的总代码服务总数的最大值和总和。

我现在想要实现的是从聚合中获取第二高的值

我需要这样的东西:

# myfunc should return for each group the second highest TOTAL_CODE_SERVED_COUNT
aggMap = {'TOTAL_CODE_SERVED_COUNT': ['sum', myfunc]}
cleanData = cleanData.groupby('CUSTOM_CRITERIA').agg(aggMap)

可以使用df.groupby()。agg()吗?

1 个答案:

答案 0 :(得分:1)

样本数据:

cleanData = pd.DataFrame({

         'TOTAL_CODE_SERVED_COUNT':[5,3,6,9,2,4,1],
         'CUSTOM_CRITERIA':list('aaabbac')
}).sort_values('CUSTOM_CRITERIA')
print (cleanData)
   TOTAL_CODE_SERVED_COUNT CUSTOM_CRITERIA
0                        5               a
1                        3               a
2                        6               a
5                        4               a
3                        9               b
4                        2               b
6                        1               c

您可以对值进行排序并获得第二高的值,如果不存在则返回相同的值:

def myfunc(x):
    y = np.sort(x)
    return y[-2] if len(y) > 1 else x

aggMap = {'TOTAL_CODE_SERVED_COUNT': ['sum', myfunc]}
cleanData1 = cleanData.groupby('CUSTOM_CRITERIA').agg(aggMap)
print (cleanData1)
                TOTAL_CODE_SERVED_COUNT       
                                    sum myfunc
CUSTOM_CRITERIA                               
a                                    18      5
b                                    11      2
c                                     1      1

如果不存在,则返回缺少值NaN

def myfunc(x):
    y = np.sort(x)
    return y[-2] if len(y) > 1 else np.nan

aggMap = {'TOTAL_CODE_SERVED_COUNT': ['sum', myfunc]}
cleanData2 = cleanData.groupby('CUSTOM_CRITERIA').agg(aggMap)
print (cleanData2)
                TOTAL_CODE_SERVED_COUNT       
                                    sum myfunc
CUSTOM_CRITERIA                               
a                                    18    5.0
b                                    11    2.0
c                                     1    NaN