[英]Filtering 2 highest unique values per person
我被困在我的项目中的数据争论步骤中,我想知道是否有人能够帮助我。
我拥有的 dataframe 的一部分是这样的:
人 | 月 | GPI |
---|---|---|
1 | 12 | 10 |
1 | 12 | 12 |
1 | 11 | 18 |
1 | 10 | 20 |
2 | 10 | 12 |
2 | 8 | 14 |
2 | 9 | 16 |
但是,我按 Person 分组,只保留 2 个最大的唯一月份值的行。 因此,对于第 1 个人,这将是第 12 和第 11 个月,对于第 2 个人,这将是第 10 和第 9 个月。最终我想平均每人的 GPI。
该表应如下所示
人 | 月 | GPI | avg_GPI |
---|---|---|---|
1 | 12 | 10 | 8 |
1 | 12 | 7 | 8 |
1 | 11 | 7 | 8 |
2 | 10 | 12 | 14 |
2 | 9 | 16 | 14 |
希望其他人可以帮助我解决这个问题。
这是创建第一个表的代码: import pandas as pd
df = pd.DataFrame({'Person':[1, 1, 1, 1, 2, 2, 2],
'month':[12, 12, 11, 10, 10, 8, 9],
'GPI':[10, 12, 18, 20, 12, 14, 16]})
提前致谢!
我们可以试试
s = df.groupby(['Person','month'])['GPI'].max().sort_values().groupby(level=[0]).tail(2)
out = df.loc[pd.MultiIndex.from_frame(df[['Person','month']]).isin(s.index)]
Out[66]:
Person month GPI
2 1 11 18
3 1 10 20
5 2 8 14
6 2 9 16
另一种方式:
df = df.groupby(['Person', 'month']).agg(list).sort_index(
ascending=False).groupby(level=0).head(2).explode('GPI')
OUTPUT:
Person month GPI
0 2 10 12
1 2 9 16
2 1 12 10
3 1 12 12
4 1 11 18
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.