【问题标题】:Filtering 2 highest unique values per person过滤每人 2 个最高的唯一值
【发布时间】:2021-06-04 14:12:00
【问题描述】:

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

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

Person month 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。

表格应该是这样的

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

希望其他人可以帮助我解决这个问题。

下面是创建第一个表的代码: 将熊猫导入为 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]})

提前致谢!

【问题讨论】:

  • 您的预期输出与您输入的数据框不匹配

标签: python pandas dataframe data-wrangling


【解决方案1】:

groupbyrank

我们可以尝试groupbyrank 选择与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

【讨论】:

  • 应该按 GPI 排名吗?
  • @BENY 不确定 OP 是否也想按GPI 排名,因为他只提到了keep the rows of the 2 largest unique month values
【解决方案2】:

我们可以试试

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

【讨论】:

  • @SkipVanDerMeer 编码愉快~
【解决方案3】:

另一种方式:

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

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多