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.agg
与as_index=False
一起使用
所以id
是一个列:
data.groupby('id',as_index=False).agg(lambda grp: grp.nlargest(100).mean())
【讨论】:
以上是关于Python:如何获取按 id 分组的每列的 n 个最大值的平均值的主要内容,如果未能解决你的问题,请参考以下文章