是否可以从已根据列值进行分组和排序的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作为等级0值的行或id,而不仅仅是该行,以及那些id以外的所有其他行。
例如,如果004不是排名0的mdf,那么我想删除所有004。
感谢您的光临!
答案 0 :(得分:2)
您可以使用布尔掩码:
mask = df['df'].ne('mdf') & df['rank'].eq(0)
excl_id = df.loc[mask, 'id'].unique()
df[~df['id'].isin(excl_id)]
答案 1 :(得分: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