删除熊猫中多列中包含一段字符串的所有行

Posted

技术标签:

【中文标题】删除熊猫中多列中包含一段字符串的所有行【英文标题】:Remove all rows containing a piece of a string in multiple columns in pandas 【发布时间】:2020-11-29 14:27:46 【问题描述】:

我有一个包含很多列的非常大的数据框。我想检查所有列并删除包含字符串“MU”的任何实例的任何行,并且有些列具有“MU#1”或“MU#2”,它们有时会切换位置(如“MU” #1 将位于索引 0 的第 1 列,而“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') ]

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

【问题讨论】:

【参考方案1】:

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

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

df[~df.stack().str.contains('MU').any(level=0)]

它是如何工作的s

选项 1

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

x.str.contains('MU', case=True, regex=True) 是 datframe 中任何包含“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'

【讨论】:

【参考方案2】:

我们如何处理all

df = df[df[['phase_1','phase_2','phase_3','phase_4']].ne('MU#1').all(1)]

更新

df = df[(~df[['phase_1','phase_2','phase_3','phase_4']].isin(['MU#1','MU#2'])).all(1)]

【讨论】:

谢谢!是否有任何内容可以在同一行中删除超过 1 个字符串?例如,我现在想删除包含“MU#1”或“SIGMA”或“MU#2”的行 @Austin 检查更新〜如果这个工作,你愿意接受吗?> 左边的复选标记【参考方案3】:

这对我来说很好。

df[~df.stack().str.contains('Any String').any(level=0)]

即使在数据框中搜索特定字符串

df[df.stack().str.contains('Any String').any(level=0)]

谢谢。

【讨论】:

以上是关于删除熊猫中多列中包含一段字符串的所有行的主要内容,如果未能解决你的问题,请参考以下文章

如何在播放框架模板的 html 标记中包含一段 java 代码?

使用正则表达式删除熊猫数据框中的子字符串

DataTables 循环遍历表并删除特定列中包含特定字符串的所有行

带有熊猫字符串列表的 str.contains 的可扩展解决方案

熊猫删除任何字符串的行

从熊猫数据框中删除大量列