Pandas groupby和平均值的唯一值

时间:2017-10-08 13:55:34

标签: python pandas dataframe pandas-groupby

我有以下数据框

   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

我想要做的是,对IDID2进行分组,并将SCORE的平均值仅考虑UNIQUE得分。

现在,如果我使用标准df.groupby(['ID', 'ID2'])['SCORE'].mean(),我会得到23.33~,我要找的是25分。

我知道我可以过滤掉XY,删除重复项并执行此操作,但我希望将它们保留为相关内容。

我怎样才能做到这一点?

3 个答案:

答案 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
相关问题