在pandas中的DataFrame上搜索“不包含”


142

我已经进行了一些搜索,无法弄清楚如何通过过滤数据帧df["col"].str.contains(word),但是我想知道是否有一种方法可以反向执行:通过该集合的补充来过滤数据帧。例如:的效果!(df["col"].str.contains(word))

可以通过一种DataFrame方法来完成吗?

Answers:


264

您可以使用invert(〜)运算符(其作用类似于非布尔数据):

new_df = df[~df["col"].str.contains(word)]

new_dfRHS返回的副本在哪里。

包含还接受正则表达式...


如果以上方法引发ValueError,则可能是由于您混合使用了数据类型,所以请使用na=False

new_df = df[~df["col"].str.contains(word, na=False)]

要么,

new_df = df[df["col"].str.contains(word) == False]

1
完善!我很熟悉regex,并且认为它在Python中与众不同-看到了很多文章,re.complies并告诉自己我以后再讲。看起来我过度适合搜索,就像您说的那样
:)

6
也许完整的示例会有所帮助:df[~df.col.str.contains(word)]返回原始数据框的副本,其中包含与该单词匹配的排除行。
丹尼斯·哥洛马佐夫

45

我也遇到了not(〜)符号的问题,所以这是另一个StackOverflow线程的另一种方式:

df[df["col"].str.contains('this|that')==False]

可以这样组合吗?df[df["col1"].str.contains('this'|'that')==False and df["col2"].str.contains('foo'|'bar')==True]?谢谢!
tommy.carstensen

是的你可以。语法说明如下:stackoverflow.com/questions/22086116/…–
tommy.carstensen

不要忘记,如果我们要删除包含“ |”的行 我们应该使用“ \”,例如 df = df[~df["col"].str.contains('\|')]
Amir

9

您可以使用Apply和Lambda选择列中包含列表中任何内容的行。对于您的方案:

df[df["col"].apply(lambda x:x not in [word1,word2,word3])]

6

在使用上面Andy推荐的命令之前,我必须摆脱NULL值。一个例子:

df = pd.DataFrame(index = [0, 1, 2], columns=['first', 'second', 'third'])
df.ix[:, 'first'] = 'myword'
df.ix[0, 'second'] = 'myword'
df.ix[2, 'second'] = 'myword'
df.ix[1, 'third'] = 'myword'
df

    first   second  third
0   myword  myword   NaN
1   myword  NaN      myword 
2   myword  myword   NaN

现在运行命令:

~df["second"].str.contains(word)

我收到以下错误:

TypeError: bad operand type for unary ~: 'float'

我首先使用dropna()或fillna()摆脱了NULL值,然后重试了命令,没有问题。


1
您也可以使用~df["second"].astype(str).str.contains(word)强制转换为str。见stackoverflow.com/questions/43568760/...
大卫ç

1
@Shoresh我们也可以使用na = False作为此问题的解决方案
Vishav Gupta

5

我希望答案已经发布

我正在添加框架以查找多个单词并从dataFrame中取反

这里'word1','word2','word3','word4'=要搜索的模式列表

df = DataFrame

column_a =来自DataFrame df的列名

Search_for_These_values = ['word1','word2','word3','word4'] 

pattern = '|'.join(Search_for_These_values)

result = df.loc[~(df['column_a'].str.contains(pattern, case=False)]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.