【问题标题】:Pandas - how to drop rows those are top n% in certain column value?Pandas - 如何删除某些列值中排名前 n% 的行?
【发布时间】:2023-02-25 03:15:18
【问题描述】:

我有一个两列的数据框:

userID | count
A      | 15
B      | 12

大约百万行。 我想过滤掉计数值前 n% 的用户 ID,因为我怀疑这是一个机器人活动。

我尝试按计数排序,但我只能想出过滤前 n 行的方法,而不是前 n '%' 行。

我可以用来根据百分比过滤掉的 pandas 技巧是什么?

【问题讨论】:

  • 你能举一个有 10 行和匹配的预期输出的例子吗?
  • 不能只按该列排序并删除最后 n% 的行吗?

标签: python pandas


【解决方案1】:

假设此输入并且您想要删除前 50% (0.5):

  userID  count
0      A     15
1      B     12
2      C      5
3      D     25
4      E     22
5      F      3
6      G      7
7      H      9
8      I     11
9      J      7

你可以sort_values按递减计数,然后计算百分比及其cumsum,最后使用boolean indexing过滤掉最高值:

target = 0.5
(df.sort_values(by='count', ascending=False)
   .assign(pct=lambda d: d['count'].div(d['count'].sum()).cumsum())
   .loc[lambda d: d['pct'].gt(target).shift().bfill()]
)

输出:

  userID  count
1      B     12
8      I     11
7      H      9
6      G      7
9      J      7
2      C      5
5      F      3

中间的:

  userID  count       pct   keep
3      D     25  0.215517  False
4      E     22  0.405172  False
0      A     15  0.534483  False
1      B     12  0.637931   True
8      I     11  0.732759   True
7      H      9  0.810345   True
6      G      7  0.870690   True
9      J      7  0.931034   True
2      C      5  0.974138   True
5      F      3  1.000000   True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 2019-06-10
    • 2022-11-22
    相关资源
    最近更新 更多