【问题标题】:Pandas get rows after groupby熊猫在 groupby 之后获得行
【发布时间】:2017-04-18 13:42:39
【问题描述】:

假设我有以下数据集:

uid iid val
 1   1   2
 1   2   3
 1   3   4
 1   4  4.5
 1   5  5.5
 2   1   3
 2   2   3
 2   3   4
 3   4  4.5
 3   5  5.5

从这些数据中,我想先按 uid 分组,然后从每个 uid 中获取最后 20% 的行数。

也就是说,由于 uid=1 有 5 行,我想从 uid=1 获取最后 1 行(5 的 20%)。

以下是我想做的:

df.groupby('uid').tail([20% of each uid])

谁能帮帮我?

【问题讨论】:

  • 你想要的输出是什么?例如 uid == 3 ?
  • @edyvedy13 由于 uid==3 只有 2 行,2 * 0.2 = 0.4,所以我想要的 uid==3 输出为无。对于uid==1,我想要下面的uid iid val 1 5 5.5

标签: python pandas dataframe group-by


【解决方案1】:

您可以尝试将自定义函数应用于groupby 对象。在函数内部计算应该取多少行,并取该组的tail 与该行数。 int 向 0 舍入,因此任何少于 5 行的组都不会对结果贡献任何行。

df.groupby('uid').apply(lambda x: x.tail(int(0.2*x.shape[0])))

【讨论】:

    【解决方案2】:

    我会使用地板除法

    df.groupby('uid').apply(lambda x: x.tail(len(x) // 5))
    
           uid  iid  val
    uid                 
    1   4    1    5  5.5
    

    您可以通过将group_keys=False 传递给groupby 来避免在索引中首先包含uid

    df.groupby('uid', group_keys=False).apply(lambda x: x.tail(len(x) // 5))
    
       uid  iid  val
    4    1    5  5.5
    

    【讨论】:

    • 如何删除第一列,即 uid 1
    猜你喜欢
    • 2021-10-02
    • 2023-02-17
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多