【问题标题】:How can I apply multiple functions involving multiple columns of a pandas dataframe with grouby?如何使用 groupby 应用涉及 pandas 数据框多列的多个函数?
【发布时间】:2021-12-29 16:27:08
【问题描述】:

考虑以下数据框:

id cat date max score
1 s1 A 12/06 9 5.4
2 s1 B 12/06 10 5.4
3 s2 C 11/04 13 4.2
4 s2 D 11/04 28 10
5 s3 E 08/02 16 5.4
5 s3 F 08/02 6 5.4

我想按“id”分组并获得第一个列 [cat, date] 但同时我想获得 max - score 列的平均值。 我认为可以通过聚合来完成:

但是通过聚合我无法访问数据框的所有列。

id cat date mean(max-score)
s1 A 12/06 4.1
s2 C 11/04 13.4
s3 E 08/02 5.6

【问题讨论】:

    标签: python pandas group-by pandas-apply


    【解决方案1】:

    从pandas 0.25开始,你也可以使用pd.namedAgg,一个非常有用的功能:

    df['diff'] = df['max'] - df['score']
    df.groupby('id').agg(cat=pd.NamedAgg(columns='cat',aggfunc='first'),
                             date=pd.NamedAgg(columns='date',aggfunc='first'),
                             mean(max-score)=pd.NamedAgg(columns='diff',aggfunc='mean'))
    

    【讨论】:

      【解决方案2】:

      你首先需要将max-score分配给mean(max-score),那么这是一个简单的groupby+agg

      (df.assign(**{'mean(max-score)': df['max']-df['score']})
         .groupby('id', as_index=False)
         .agg({'cat': 'first', 'date': 'first', 'mean(max-score)': 'mean'})
      )
      

      输出:

         id cat   date  mean(max-score)
      0  s1   A  12/06              4.1
      1  s2   C  11/04             13.4
      2  s3   E  08/02              5.6
      

      【讨论】:

      • 回答很有帮助,非常感谢,但我还有一个问题,“**”运算符的作用是什么?
      • **是将字典扩展为assign方法的参数。 X(**{'A': 'B'}) 等同于X(A='B'),但也允许使用不是有效python参数名称的“A”名称(例如mean(max-score),由于括号和破折号)。
      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      相关资源
      最近更新 更多