熊猫groupby,过滤器和聚合函数

时间:2019-12-27 13:01:46

标签: python pandas

我在熊猫中有以下数据框

  key     time      outlier      
  1_2     4         False
  1_2     2         True
  1_2     2         True
  1_2     5         True
  1_2     6         False
  1_3     10        False
  1_3     12        False
  1_3     10        True
  1_3     20        True

我想计算keyoutlier的每个True级别的均值,中位数和计数。我想要的数据帧如下

  key     time      outlier     outlier_avg      outlier_median     outlier_count    
  1_2     4         False       3                2                  3
  1_2     2         True        3                2                  3 
  1_2     2         True        3                2                  3
  1_2     5         True        3                2                  3
  1_2     6         False       3                2                  3
  1_3     10        False       15               15                 2
  1_3     12        False       15               15                 2
  1_3     10        True        15               15                 2
  1_3     20        True        15               15                 2

平均值,中位数和计数将在键之间重复,这很好。我正在熊猫里做下面的事情

  data.groupby('key').filter(lambda x : x['outlier'] == True).agg({'time':['mean','median', 'count'])

1 个答案:

答案 0 :(得分:1)

首先用boolean indexing进行过滤,然后进行汇总,并用DataFrame.add_prefix重命名列名,最后DataFrame.join则恢复为原始名称:

df = (data.join(data[data['outlier']].groupby('key')['time'].agg(['mean','median', 'count'])
                                     .add_prefix('outlier_'), on='key'))
print (df)
   key  time  outlier  outlier_mean  outlier_median  outlier_count
0  1_2     4    False             3               2              3
1  1_2     2     True             3               2              3
2  1_2     2     True             3               2              3
3  1_2     5     True             3               2              3
4  1_2     6    False             3               2              3
5  1_3    10    False            15              15              2
6  1_3    12    False            15              15              2
7  1_3    10     True            15              15              2
8  1_3    20     True            15              15              2

编辑:分别处理TrueFalse列的解决方案:

df = data.groupby(['key','outlier'])['time'].agg(['mean','median', 'count']).unstack()
df.columns = df.columns.map(lambda x: f'outlier_{x[0]}_{x[1]}')

df = data.join(df, on='key')

print (df)
   key  time  outlier  outlier_mean_False  outlier_mean_True  \
0  1_2     4    False                   5                  3   
1  1_2     2     True                   5                  3   
2  1_2     2     True                   5                  3   
3  1_2     5     True                   5                  3   
4  1_2     6    False                   5                  3   
5  1_3    10    False                  11                 15   
6  1_3    12    False                  11                 15   
7  1_3    10     True                  11                 15   
8  1_3    20     True                  11                 15   

   outlier_median_False  outlier_median_True  outlier_count_False  \
0                     5                    2                    2   
1                     5                    2                    2   
2                     5                    2                    2   
3                     5                    2                    2   
4                     5                    2                    2   
5                    11                   15                    2   
6                    11                   15                    2   
7                    11                   15                    2   
8                    11                   15                    2   

   outlier_count_True  
0                   3  
1                   3  
2                   3  
3                   3  
4                   3  
5                   2  
6                   2  
7                   2