我想首先按id
进行分组,然后计算每个id
,有多少行score
> avg
。
数据帧:
id col1 avg score
a 1 3 3
a 0 4 3
a 1 3 5
b 1 2 4
b 1 4 5
想:
id score>avg total
a 1 3
b 2 2
我的代码:
df2 = df.groupby('id', as_index=False)[['score'] > ['avg']].agg({'score>avg': 'count', 'total': 'count'})
我得到的错误:
KeyError: 'Column not found: False'
我不确定我应该将[['score'] > ['avg']]
部分编辑为。
答案 0 :(得分:2)
您可以做的一件事是首先创建一列布尔值,指示得分是否大于平均值,然后按“id”分组,sum
和count
新列。
df['score_gt_avg'] = df.score > df.avg
df.groupby('id')['score_gt_avg'].agg([('score>avg', 'sum'),('total', 'count')])
score>avg total
id
a 1.0 3
b 2.0 2
同样地,您也可以在一行中完成:
df.score.gt(df.avg).groupby(df.id).agg([('score>avg', 'sum'),('total', 'count')])