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

Filtering 2 highest unique values per person

我在我的项目中遇到了数据争论步骤,我想知道是否有人能够帮助我。

我的部分数据框是这样的:

GPI
1 12 10
1 12 12
1 11 18
1 10 20
2 10 12
2 8 14
2 9 16

但是,我按人分组,只保留 2 个最大的唯一月份值的行。因此,对于第 1 个人,这将是第 12 个月和第 11 个月,对于第 2 个人,这将是第 10 个月和第 9 个月。最终我想平均每个人的 GPI。

table 应该是这样的

GPI avg_GPI
1 12 10 8
1 12 7 8
1 11 7 8
2 10 12 14
2 9 16 14

希望有人能帮我解决这个问题。

这是创建第一个 Table 的代码: 将 pandas 导入为 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')

输出:

   Person  month GPI
0       2     10  12
1       2      9  16
2       1     12  10
3       1     12  12
4       1     11  18

groupby and rank

我们可以尝试 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