【问题标题】:Phyton: How to get the average of the n largest values for each column grouped by idPython:如何获取按 id 分组的每列的 n 个最大值的平均值
【发布时间】:2020-03-22 19:58:17
【问题描述】:

我试图在按 id 分组时获取每列的平均值。但我没有让它按我的意愿工作。

数据:

ID       Property3   Property2   Property3
1        10.2        ...         ...
1        20.1
1        51.9
1        15.8
1        12.5
...
1203     104.4
1203     11.5
1203     19.4
1203     23.1

到目前为止我得到了什么:
我得到了这两个尝试。但它们都只用于一列,我不知道该怎么做。:

data.groupby('id')['property1'].apply(lambda grp: grp.nlargest(100).mean())
1       37.897989
2       33.059432
3       34.926530
4       33.036137

data.groupby('id').agg({'property1': {lambda grp: grp.nlargest(100).mean()}})
id  property1 <lambda>
1   37.897989
2   33.059432
3   34.926530
4   33.036137

我想要什么:
理想情况下,我希望有一个如下数据框:

ID       Property3   Property2   Property3
1        37.8        5.6         2.3
2        33.0        1.5         10.4
3        34.9        91.5        10.3
4        33.0        10.3        14.3

这样每一行都包含按 id 分组的每个列的 100 个最大值的平均值。

【问题讨论】:

    标签: python pandas dataframe lambda pandas-groupby


    【解决方案1】:

    使用带有省略列的GroupBy.agg处理DataFrame中没有ID的所有列:

    df = data.groupby('ID').agg(lambda grp: grp.nlargest(100).mean()).reset_index()
    
    print (df)
           ID  Property1  Property2  Property3
    0     1.0       22.1       ...       ...
    1  1203.0       39.6       ...       ...
    

    或者指定groupby之后的列:

    df = (data.groupby('ID')['Property1','Property2','Property3']
              .agg(lambda grp: grp.nlargest(100).mean())
              .reset_index())
    

    【讨论】:

    • 太棒了。非常感谢
    【解决方案2】:

    GroupBy.aggas_index=False 一起使用 所以id 是一个列:

    data.groupby('id',as_index=False).agg(lambda grp: grp.nlargest(100).mean())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多