删除 pandas 中多列中包含字符串片段的所有行

Aus*_*tin 4 python slice dataframe pandas

我有一个非常大的数据框,有很多列。我想检查所有列并删除包含字符串“MU”的任何实例的任何行,并且有些列具有“MU#1”或“MU#2”,它们有时会交换位置(例如“MU” #1 将位于第 1 列中的索引 0 处,“MU#2”将位于第 1 列中的索引 1 处)。最初,我尝试用此方法删除它们,但如果我尝试对上面的两个字符串执行此操作,它会变得太麻烦:

df_slice = df[(df.phase_2 != 'MU#1') & (df.phase_3 != 'MU#1') & (df.phase_1 != 'MU#1') & (df.phase_4 != 'MU#1') ]
Run Code Online (Sandbox Code Playgroud)

这可能有效,但我必须使用其他数据帧重复此切片几次,并且我想有一个更简单的路线。我还有比上面显示的更多的列,但这只是一个片段。简而言之,所有列都需要检查“MU”,并且需要删除带有“MU”的行。谢谢!

wwn*_*nde 5

您也可以尝试.str.contains()应用于数据框。这避免了对列进行硬编码,以防万一

df[df.apply(lambda x: (~x.str.contains('MU', case=True, regex=True)))].dropna()
Run Code Online (Sandbox Code Playgroud)

或者

df[~df.stack().str.contains('MU').any(level=0)]
Run Code Online (Sandbox Code Playgroud)

怎么运行

选项1

当在df.apply(),中使用时x.str.contains,# 是数据框中包含的任何列的通配符

x.str.contains('MU', case=True, regex=True)是数据框中包含“MU”的任何列的通配符,区分大小写并隐含正则表达式

~相反,因此您最终会得到没有 MU 的行

NaN不满足条件时返回结果数据帧。.dropna()因此消除了行NaN

选项2

df.stack()# Stacks the dataframe
df.stack().str.contains('MU')#boolean selects rows with the string 'MU'
df.stack().str.contains('MU').any(level=0)# Selects the index
~df.stack().str.contains('MU').any(level=0)# Reverses the selection taking only those without string 'MU'
Run Code Online (Sandbox Code Playgroud)