我有一个数据框:
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
答案 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
等效的操作,因此我遍历各列并进行转置(所以我想可能有更好的方法)