首页 > 解决方案 > 熊猫有条件地在聚合操作中包含值

问题描述

对于以下数据框:

import pandas as pd
df = pd.DataFrame({
    'trigger':[0,0,0, 1,1,1, 2,2,2, 3,3,3,], 
    'score'  :[1,0,0, 0,1,0 ,0,0,1 ,1,1,1], 
    'label'  :[1,0,0, 0,1,0 ,0,0,1 ,1,1,1]
})

# in reality ranked using some other column
df['rank'] = df.groupby(['trigger']).cumcount()
display(df)

我几乎想计算:

d_eval = df[df['rank'] <=2]
d_eval.groupby(['trigger']).agg({'score':'max', 'label':'max'})

但是,我不想放弃其他值(不包括在排名过滤器中),而只考虑聚合中过滤的值。

还有其他方法吗:

  1. 过滤
  2. 加入结果
  3. 继续

大熊猫更直接?

标签: pythonpandasconditional-statements

解决方案


一种选择是merge

d_eval = (df[df['rank'] <=2].groupby(['trigger'])
            .agg({'score':'max', 'label':'max'})
         )

df.merge(d_eval, on='trigger', suffixes=['','_max'])

输出:

    trigger  score  label  rank  score_max  label_max
0         0      1      1     0          1          1
1         0      0      0     1          1          1
2         0      0      0     2          1          1
3         1      0      0     0          1          1
4         1      1      1     1          1          1
5         1      0      0     2          1          1
6         2      0      0     0          1          1
7         2      0      0     1          1          1
8         2      1      1     2          1          1
9         3      1      1     0          1          1
10        3      1      1     1          1          1
11        3      1      1     2          1          1

或某种单线

df.merge(df.assign(rank=df.groupby('trigger').cumcount())
           .query('rank <=2')
           .groupby('trigger')[['score','label']].max(),
         on='trigger', suffixes=['','_max']
        )

推荐阅读