【问题标题】:Filter based on pairs within a group - if value represent at the end基于组内的对进行过滤 - 如果值表示在末尾
【发布时间】:2021-09-01 21:09:39
【问题描述】:
Group Code
 1     2
 1     2
 1     4
 1     1
 2     4 
 2     1
 2     2 
 2     3
 2     1
 2     1
 2     3

在每个组中都有对。例如在第 1 组中;对是 (2,2),(2,4),(4,1)

我想根据代码对的末尾出现的代码号 2 或 4 过滤这些对。例如在第 1 组中,只有 (2,2) 和 (2,4) 将被保留,而 (4,1) 将被过滤掉。

我用来确定开头出现的代码编号的代码是

  df[df.groupby("Group")['Code'].shift().isin([2,4])|df['Code'].isin([2,4])]

异常输出:

Group Code
 1     2
 1     2
 1     4
 2     1 
 2     2

【问题讨论】:

    标签: python pandas dataframe numpy filter


    【解决方案1】:

    使用您自己的建议代码,您可以对其进行修改以实现您的目标:

    idx = df.groupby("Group")['Code'].shift(-1).isin([2,4])
    df[idx | idx.shift()]
    

    首先将'Group' 分组,然后将shift 向上分组并检查值 2 或 4。最后,您需要满足条件的对的结尾(即 idx)和对的开头(即idx.shift())

    输出:

        Group   Code
    0   1   2
    1   1   2
    2   1   4
    5   2   1
    6   2   2
    

    【讨论】:

      【解决方案2】:

      假设数据按Group排序,也可以不使用groupby()进行排序,节省一些处理,加快处理速度,如下:

      m = df['Code'].isin([2,4]) & df['Group'].eq(df['Group'].shift())
      df[m | m.shift(-1)]
      

      结果:

         Group  Code
      0      1     2
      1      1     2
      2      1     4
      5      2     1
      6      2     2
      

      【讨论】:

      • 需要在组内分析对吗?该代码如何解释这一点?假设组列未排序。
      • @SeaBean 不是 df['Group'].eq(df['Group'].shift()) 分组假设 Group 列已排序(按任意键)?
      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 2019-08-27
      • 2016-11-03
      • 2020-12-11
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多