【问题标题】:Removing rows from a dataframe based on condition or value根据条件或值从数据框中删除行
【发布时间】:2019-07-27 03:50:14
【问题描述】:

有没有一种方法可以从已根据列值分组和排序的 df 中删除数据?

    id               time_stamp          df  rank
   002         2019-02-23 20:01:13.362  mdf   0
   002         2019-02-23 20:02:06.939  tof   1
   004         2019-03-01 02:30:33.332  mdf   0
   004         2019-03-01 02:34:21.134  tof   1

数据已按 id 列分组,并按时间戳升序排序。 我想删除所有没有 mdf 作为 rank 0 值的行或 id,但不仅是该行,还删除该 id 之外的所有其他行。

例如,如果 004 不是等级 0 的 mdf,如果有意义,我想删除所有 004。

感谢收看!

【问题讨论】:

  • 克里斯,您说 004 组没有 mdf 和 0 等级。但是,它出现在您的模拟数据的第 3 行。请澄清您的问题陈述或修改数据。
  • 我的意思是,例如,如果存在我想删除它,谢谢!

标签: python python-3.x pandas dataframe group-by


【解决方案1】:

您可以使用布尔掩码:

mask = df['df'].ne('mdf') & df['rank'].eq(0)
excl_id = df.loc[mask, 'id'].unique()

df[~df['id'].isin(excl_id)]

【讨论】:

    【解决方案2】:

    这是我的解决方案:

        data="""
    id,time_stamp,df,rank
    002,2019-02-23 20:01:13.362,mdf,0
    002,2019-02-23 20:02:06.939,tof,1
    004,2019-03-01 02:30:33.332,mdf,0
    004,2019-03-01 02:34:21.134,tof,1
    005,2019-03-01 02:35:21.134,mdf,1
    005,2019-03-01 02:35:24.134,tof,1
       """
    df = pd.read_csv(pd.compat.StringIO(data), sep=',')
    print(df)
    
    def process(x):   # the id 005 have to be deleted
        f = x[(x['df']=='mdf')& (x['rank'] == 0)]
        return not f.empty
    
    df = df.groupby('id').filter(lambda x: process(x)).reset_index(drop=True)
    print(df)
    

    输出:

       id               time_stamp   df  rank
    0   2  2019-02-23 20:01:13.362  mdf     0
    1   2  2019-02-23 20:02:06.939  tof     1
    2   4  2019-03-01 02:30:33.332  mdf     0
    3   4  2019-03-01 02:34:21.134  tof     1
    

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 2015-03-13
      • 2016-07-07
      • 1970-01-01
      相关资源
      最近更新 更多