我正在尝试按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分组的EACH列的100个最大值的平均值。
答案 0 :(得分:2)
使用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())
答案 1 :(得分:1)
将GroupBy.agg
与as_index=False
一起使用
因此id
是一列:
data.groupby('id',as_index=False).agg(lambda grp: grp.nlargest(100).mean())