删除熊猫中多列中包含一段字符串的所有行
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 循环遍历表并删除特定列中包含特定字符串的所有行