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

时间:2019-11-27 09:41:47

标签: python pandas dataframe lambda pandas-groupby

我正在尝试按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个最大值的平均值。

2 个答案:

答案 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.aggas_index=False一起使用 因此id是一列:

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