【问题标题】:DataFrame filter based on groupby基于groupby的DataFrame过滤器
【发布时间】:2017-07-12 15:03:58
【问题描述】:

这是我的简化示例 df:

      salesPerson customer measure timeStamp
      --------------------------------------
      A           123      I       12:30
      A           123      II      12:30
      A           123      III     12:30
      B           123      IV      12:35
      C           456      I       14:30
      C           456      II      14:30
      D           456      III     14:15

我想要做的是归档数据框,如果 2 个不同的销售人员 ID 具有相同的客户编号,请保留时间戳最早的销售人员的所有行。此示例中的结果 df 将是:

      salesPerson customer measure timeStamp
      --------------------------------------
      A           123      I       12:30
      A           123      II      12:30
      A           123      III     12:30
      D           456      III     14:15

最好/最 Pythonic 的方法是什么?我考虑过使用 pandas groupby.filter 或 groupby.transform,但坦率地说不知道如何准确地编写这些。

奖励积分将用于将已删除的行放在单独的 deleted_df 对象中。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    这个单线应该可以解决问题:

    df[df['salesPerson'].isin(df.iloc[df.groupby(['customer'])['timeStamp'].idxmin(), 'salesPerson'])]
    

    说明:

    要确定我们要过滤的销售人员,首先将dfcustomer 分组,然后使用idxmin 获取找到最小timeStamp 的索引:

    df.groupby(['customer'])['timeStamp'].idxmin()
    

    然后,将这些索引值连同我们想要的列一起传递给iloc,以从salesPerson 中获取值,我们将用于过滤:

    df.iloc[df.groupby(['customer'])['timeStamp'].idxmin(), 'salesPerson']
    

    最后,将该结果传递给 Series 方法 isin,并使用它来索引到 df。结果是这样的:

    0  A  123    I 2017-07-12 12:30:00
    1  A  123   II 2017-07-12 12:30:00
    2  A  123  III 2017-07-12 12:30:00
    6  D  456  III 2017-07-12 14:15:00
    

    要使用过滤掉的行创建第二个 DataFrame,您可以将过滤后的 df 中的索引传递给原始 df 并排除这些行。因此,如果我们将上面的结果分配给df1,我们可以通过这种方式创建一个互补的df2

    df2 = df[~df.index.isin(df1.index)]
    

    结果:

    3  B  123  IV 2017-07-12 12:35:00
    4  C  456   I 2017-07-12 14:30:00
    5  C  456  II 2017-07-12 14:30:00
    

    【讨论】:

      猜你喜欢
      • 2020-06-24
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      相关资源
      最近更新 更多