【问题标题】:Get all rows after the last occurrence of a specific value in pandas在熊猫中最后一次出现特定值之后获取所有行
【发布时间】:2019-02-15 01:51:17
【问题描述】:

我的数据框看起来像

ID  colA  
1      B     
1      D     
2      B    
2      D     
2      C     

我已返回每组中最后一次发生事件 B 之后的所有行。输出将是:

ID  colA   
1      D   
2      D     
2      C  

我试过了

a = df['colA'].str.contains('B').groupby(df['ID'])
b = df[(a.transform('sum') - a.cumsum()).eq(0)]

到目前为止一切正常。我只是想知道是否有任何替代方法可以实现这一目标?

【问题讨论】:

  • 这对每个 ID 都有效吗?
  • 如果一个组从不包含B,它应该不返回那个ID吗?
  • 是的。它应该返回 Nothing。但我已经过滤了数据框以确保它确实有事件 B

标签: python pandas dataframe group-by pandas-groupby


【解决方案1】:

反转你的行(这很重要)。然后调用groupbycumsum,取所有(反转)cumsum 值为零的行。

df[df.colA.eq('B')[::-1].astype(int).groupby(df.ID).cumsum().eq(0)]

   ID colA
1   1    D
3   2    D
4   2    C

【讨论】:

    【解决方案2】:

    IIUC

    def yourlast(x):
            return x.loc[x.colA.where(df.colA.eq('B')).last_valid_index()+1:]
    df.groupby('ID').apply(yourlast)
    Out[163]: 
          ID colA
    ID           
    1  1   1    D
    2  3   2    D
       4   2    C
    

    【讨论】:

    • 您可以添加group_keys=False 以摆脱多索引。 +1
    【解决方案3】:

    你可以这样做:

    ix = (df.colA.eq('B')
            .cumsum()
            .groupby(df.ID)
            .apply(lambda x: x.loc[x.idxmax()+1:]).index.get_level_values(1))
    
    df.loc[ix,:]
    
        ID colA
    1   1    D
    3   2    D
    4   2    C
    

    【讨论】:

      猜你喜欢
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 2020-09-11
      相关资源
      最近更新 更多