225

我已经进行了一些搜索,但无法弄清楚如何通过 过滤数据帧df["col"].str.contains(word),但是我想知道是否有相反的方法:通过该集合的恭维过滤数据帧。例如:大意是!(df["col"].str.contains(word))

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

4

7 回答 7

427

您可以使用反转 (~) 运算符(它的作用类似于布尔数据的 not):

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

new_df, RHS返回的副本在哪里。

包含也接受一个正则表达式...


如果上面抛出一个 ValueError,原因很可能是因为你有混合数据类型,所以使用na=False

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

或者,

new_df = df[df["col"].str.contains(word) == False]
于 2013-06-13T21:51:44.240 回答
75

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

df[df["col"].str.contains('this|that')==False]
于 2016-12-15T21:10:34.647 回答
17

您可以使用 Apply 和 Lambda :

df[df["col"].apply(lambda x: word not in x)]

或者如果你想定义更复杂的规则,你可以使用 AND:

df[df["col"].apply(lambda x: word_1 not in x and word_2 not in x)]
于 2019-01-14T03:13:29.297 回答
12

我希望答案已经发布

我正在添加框架以查找多个单词并从 dataFrame 否定这些单词

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

df= 数据框

column_a= 来自 DataFrame df 的列名

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

pattern = '|'.join(values_to_remove)

result = df.loc[~df['column_a'].str.contains(pattern, case=False)]
于 2019-02-08T13:37:18.013 回答
7

在使用上面 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 值,然后重试该命令没有问题。

于 2016-11-22T22:06:59.337 回答
3

除了 nanselm2 的答案,您可以使用0代替False

df["col"].str.contains(word)==0
于 2018-10-16T07:01:59.087 回答
0

为了补充上述问题,如果有人想删除所有带字符串的行,可以这样做: df_new=df[~df['col_name'].apply(lambda x: isinstance(x, str))]

于 2021-08-05T14:28:09.160 回答