繁体   English   中英

过滤每人 2 个最高的唯一值

[英]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]})

提前致谢!

groupbyrank

我们可以尝试groupbyrank到 select 行对应于每个Person最大的 2 个月值

df[df.groupby('Person')['month'].rank('dense', False) <= 2]

   Person  month  GPI
0       1     12   10
1       1     12   12
2       1     11   18
4       2     10   12
6       2      9   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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM