Python:如何获取按 id 分组的每列的 n 个最大值的平均值

Posted

技术标签:

【中文标题】Python:如何获取按 id 分组的每列的 n 个最大值的平均值【英文标题】:Phyton: How to get the average of the n largest values for each column grouped by id 【发布时间】: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 个最大值的平均值。

【问题讨论】:

【参考方案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())

【讨论】:

以上是关于Python:如何获取按 id 分组的每列的 n 个最大值的平均值的主要内容,如果未能解决你的问题,请参考以下文章

更有效的方法:按变量分组的许多列的 value_counts (in %)

如何在 Python 中对每列的唯一值求和? [复制]

如何按一列的最大值获取SQL行,按另一列分组

请问如何获得GridView选中行的每一列的信息?

获取表中不同列的最新 NOT NULL 值,按公共列分组

在 Pandas 中获取每个分区的每列平均值 [重复]