如果单元格不包含子字符串,则在数据框中删除行

时间:2020-09-01 21:30:11

标签: python pandas dataframe

我有一个数据框:

id     A       B       C
123  Tom-ok    2      Red
454  Alan     4-ok    Blue
546  Bryan      5      Yellow
210   May      1      Purple-ok

我要删除行而没有子字符串-ok 我试过了但是没用:

df.set_index('id', inplace=True)
df.drop([col for col in df.columns if ~df[col].str.contains('-ok').any()], axis=0)

我的预期输出没有布莱恩的行。

id     A       B       C
123  Tom-ok    2      Red
454  Alan     4-ok    Blue
210   May      1      Purple-ok

2 个答案:

答案 0 :(得分:1)

也许可以以一种更简洁的方式完成操作,但这应该可以:

df['condition'] = df.applymap(lambda x: '-ok' in str(x)).apply(lambda x:any(x),axis=1)
df = df.loc[~df.condition].drop(columns='condition')

答案 1 :(得分:1)

您可以这样做:

df = df[pd.DataFrame([df[col].str.contains('-ok') for col in df.columns]).T.any(axis=1)]

给予:

          A     B          C
id                          
123  Tom-ok     2        Red
454    Alan  4-ok       Blue
210     May     1  Purple-ok

索引的对象是包含'-ok'的行的布尔掩码:

# pd.DataFrame([df[col].str.contains('-ok') for col in df.columns]).T.any(axis=1)

id
123     True
454     True
546    False
210     True
dtype: bool

我找不到如何在整个DataFrame(或行)上执行与str.contains等效的操作,因此我遍历各列并进行转置(所以我想可能有更好的方法)

相关问题