【问题标题】:Mean by group, exclude some rows按组表示,排除某些行
【发布时间】:2022-01-16 15:26:36
【问题描述】:

我有一个下表,想按州计算平均值,我想只计算客户为 1 的行的平均值

Customer State Score Output_Mean
0 GA 1
1 GA 2 2.5
1 GA 3 2.5
1 NY 9 8
1 NY 7 8
0 DC 6
0 DC 4

我有以下代码,如何添加客户条件?

df['output_mean'] = (df.fillna({'state':'missing'}).groupby(['state'])['score'].transform(lambda x: x.mean()))

【问题讨论】:

    标签: pandas mean


    【解决方案1】:

    你可以在你想要的地方更新:

    customer_1 = df['Customer'].eq(1)
    df.loc[customer_1, 'Output_Mean'] = df[customer_1].groupby('State')['Score'].transform('mean')
    

    对于大多数(后来的)Pandas 版本,您可以放弃左侧的 customer_1 并执行以下操作:

    df['Output_Mean'] = df[customer_1].groupby('State')['Score'].transform('mean')
    

    或者只是一个不带面具的query

    df['Output_Mean'] = df.query('Customer == 1').groupby('State')['Score'].transform('mean')
    

    输出:

       Customer State  Score  Output_Mean
    0         0   GA       1          NaN
    1         1   GA       2          2.5
    2         1   GA       3          2.5
    3         1   NY       9          8.0
    4         1   NY       7          8.0
    5         0   DC       6          NaN
    6         0   DC       4          NaN
    

    【讨论】:

      【解决方案2】:

      您可以在groupby(连同State)中包含customer==1 的掩码,并使用np.where 将值分配给df['output_mean']

      mask = df['Customer']==1
      df['output_mean'] = np.where(mask, df.fillna({'State':'missing'}).groupby([mask,'State'])['Score'].transform('mean'), np.nan)
      

      输出:

         Customer State  Score  output_mean
      0         0    GA      1          NaN
      1         1    GA      2          2.5
      2         1    GA      3          2.5
      3         1    NY      9          8.0
      4         1    NY      7          8.0
      5         0    DC      6          NaN
      6         0    DC      4          NaN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-05
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 2014-07-23
        • 1970-01-01
        • 2019-02-12
        相关资源
        最近更新 更多