【问题标题】:How to get a subset of rows from a group in a pandas dataframe?如何从熊猫数据框中的组中获取行的子集?
【发布时间】:2019-04-09 21:30:38
【问题描述】:

我有一个带有列 ID 和二进制列的数据框,如下例所示

     ID    BINARY_MASK
0   101        1
1   101        0
2   101        1
3   101        1
4   101        1
5   101        1
6   101        0
7   101        1
8   102        1 
9   102        1
11  102        1
12  102        1
13  102        0 
14  102        0

我想要做的是获取 每个 ID 组为 1 的前四个连续条目。 我想看到的结果如下:

     ID    BINARY_MASK
2   101        1
3   101        1
4   101        1
5   101        1
8   102        1 
9   102        1
11  102        1
12  102        1

组内有四个连续索引的组内的索引每组不同,如示例中所示。 我该怎么做?

我已经尝试了by Bill G in this question 提供的解决方案,但这对我不起作用。

使用 Pandas 数据框和 Python 3.6

【问题讨论】:

    标签: python-3.x pandas pandas-groupby


    【解决方案1】:

    GroupBy.transform 创建辅助系列,将shifted 的shifted 值与ne (!=) 进行比较,并与另一个条件链接,最后按boolean indexing 过滤:

    s = df['BINARY_MASK'].ne(df['BINARY_MASK'].shift()).cumsum()
    m1 = df.groupby(s)['BINARY_MASK'].transform('size') >= 4
    m2 = df['BINARY_MASK'] == 1
    
    df = df[m1 & m2]
    print (df)
         ID  BINARY_MASK
    2   101            1
    3   101            1
    4   101            1
    5   101            1
    7   101            1
    8   102            1
    9   102            1
    11  102            1
    12  102            1
    

    【讨论】:

      【解决方案2】:

      querygroupby with head

      最简单的做法是在分组之前过滤哪些是。您可以通过多种方式进行过滤,我选择使用query

      df.query('BINARY_MASK == 1').groupby('ID').head(4)
      
           ID  BINARY_MASK
      0   101            1
      2   101            1
      3   101            1
      4   101            1
      8   102            1
      9   102            1
      11  102            1
      12  102            1
      

      【讨论】:

      • 感谢您的回答!但是,我的问题措辞错误(现在已编辑),并且正在寻找数据中的前 4 个 连续 问题。如果您查看示例,对于 ID 101,我想检索索引 2、3、4 和 5,并且根据您的答案,我会得到 0、2、3 和 4。
      • 这完全改变了问题的性质。我建议回滚编辑并提出一个新问题。
      • 好的,那我就这么做。
      • @jezrael 我仍然建议 OP 提出一个新问题。我们不应该在人们回答后改变问题的性质。
      • @ChubaChuubs - 如果您的问题应该彻底修改,我绝对同意,但这里添加了上一段中也提到的一个词,因此没有必要提出新问题(在我看来)
      【解决方案3】:

      使用groupby + head

      df[df['BINARY_MASK']==1].groupby('ID').head(4)
      
           ID  BINARY_MASK
      0   101            1
      2   101            1
      3   101            1
      4   101            1
      8   102            1
      9   102            1
      11  102            1
      12  102            1
      

      【讨论】:

        猜你喜欢
        • 2015-05-10
        • 2021-06-02
        • 2013-04-14
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 2016-03-28
        • 2021-08-30
        相关资源
        最近更新 更多