根据条件或值从数据框中删除行

问题描述 投票:0回答:2

有没有办法可以从已根据列值进行分组和排序的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的一部分。

对于ex,如果004不是mdf的等级0我想删除所有004,如果这是有道理的。

谢谢你的期待!

python python-3.x pandas dataframe group-by
2个回答
2
投票

你可以使用布尔掩码:

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

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

0
投票

我的解决方案:

    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
© www.soinside.com 2019 - 2024. All rights reserved.