我有以下数据框
ID ID2 SCORE X Y
0 0 a 10 1 2
1 0 b 20 2 3
2 0 b 20 3 4
3 0 b 30 4 5
4 1 c 5 5 6
5 1 d 6 6 7
我想要做的是,对ID
和ID2
进行分组,并将SCORE
的平均值仅考虑UNIQUE得分。
现在,如果我使用标准df.groupby(['ID', 'ID2'])['SCORE'].mean()
,我会得到23.33~,我要找的是25分。
我知道我可以过滤掉X
和Y
,删除重复项并执行此操作,但我希望将它们保留为相关内容。
我怎样才能做到这一点?
答案 0 :(得分:5)
如果我理解正确:
In [41]: df.groupby(['ID', 'ID2'])['SCORE'].agg(lambda x: x.unique().sum()/x.nunique())
Out[41]:
ID ID2
0 a 10
b 25
1 c 5
d 6
Name: SCORE, dtype: int64
或更容易:
In [43]: df.groupby(['ID', 'ID2'])['SCORE'].agg(lambda x: x.unique().mean())
Out[43]:
ID ID2
0 a 10
b 25
1 c 5
d 6
Name: SCORE, dtype: int64
答案 1 :(得分:1)
您可以通过预先删除重复项来获得('ID', 'ID2')
组内的唯一分数。
cols = ['ID', 'ID2', 'SCORE']
d1 = df.drop_duplicates(cols)
d1.groupby(cols[:-1]).SCORE.mean()
ID ID2
0 a 10
b 25
1 c 5
d 6
Name: SCORE, dtype: int64
答案 2 :(得分:1)
您也可以使用
In [108]: df.drop_duplicates(['ID', 'ID2', 'SCORE']).groupby(['ID', 'ID2'])['SCORE'].mean()
Out[108]:
ID ID2
0 a 10
b 25
1 c 5
d 6
Name: SCORE, dtype: int64