【问题标题】:Pandas groupby and average across unique valuesPandas groupby 和不同值的平均值
【发布时间】:2017-10-08 13:55:33
【问题描述】:

我有以下数据框

   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 进行平均,仅考虑唯一分数。

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

我知道我可以过滤掉 XY,删除重复项并执行此操作,但我想保留它们的相关性。

我怎样才能做到这一点?

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    如果我理解正确:

    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
    

    【讨论】:

    • 应该是 25,而不是 35,因为 20 和 30 的平均值
    • lambda x: x.unique().sum()/x.nunique()) 似乎有效!
    • @bluesummers,是的,我得到了同样的解决方案...... :-)
    【解决方案2】:

    你也可以使用

    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
    

    【讨论】:

      【解决方案3】:

      您可以通过预先删除重复项来获得('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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-20
        • 2020-07-04
        • 2017-08-05
        • 1970-01-01
        • 2021-06-26
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多