Python Pandas组然后按条件过滤

时间:2017-01-17 05:48:00

标签: python pandas group-by

我想首先按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']]部分编辑为。

1 个答案:

答案 0 :(得分:2)

您可以做的一件事是首先创建一列布尔值,指示得分是否大于平均值,然后按“id”分组,sumcount新列。

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')])