搜索“does-not-contain”;在熊猫的数据框架上

我做了一些搜索,不知道如何过滤一个数据框架

df["col"].str.contains(word)

然而,我想知道是否有一种方法可以做相反的事情:通过该集合的赞美来过滤数据帧。例:效果是

!(df["col"].str.contains(word))

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

322562 次浏览

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

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

其中new_df是RHS返回的副本。

Contains也接受正则表达式…


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

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

或者,

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

在使用上面安迪推荐的命令之前,我必须去掉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值,然后重试该命令,没有问题。

我在not(~)符号上也遇到了麻烦,所以这里是另一个StackOverflow线程的另一种方法:

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

除了nanselm2的答案,你可以使用0来代替False:

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

你可以使用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)]

我希望答案已经贴出来了

我正在添加框架来查找多个单词,并否定那些从dataFrame

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

df = DataFrame

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)]

为了补充上面的问题,如果有人想删除所有带字符串的行,可以这样做:

df_new=df[~df['col_name'].apply(lambda x: isinstance(x, str))]

使用~对查询求反。使用query的优点是直接返回df的有效观测值:

df.query('~col.str.contains("word").values')

以某种方式”。包含“不适合我,但当我尝试的时候”。正如@kenan在答案(如何从熊猫数据帧中删除包含特定列中的特定字符串的行?)中提到的那样,它是有效的。进一步说,如果你想查看整个数据帧,并删除那些有特定单词(或一组单词)的行,只需使用下面的循环

for col in df.columns:
df = df[~df[col].isin(['string or string list separeted by comma'])]

只需删除~以获得包含单词的数据框架