2017-01-17 11 views
1

idで最初にグループ化しようとしていて、それぞれidをカウントし、何個の行がscore>avgであるかを数えます。Python Pandasグループの条件でフィルタを適用

データフレーム:

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']]部分を編集する必要があるかどうかわかりません。

答えて

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 

は、等価的に、あなたはまた、1行で行うことができます。

df.score.gt(df.avg).groupby(df.id).agg([('score>avg', 'sum'),('total', 'count')]) 
関連する問題