【发布时间】:2013-06-10 11:06:27
【问题描述】:
我已经进行了一些搜索,但无法弄清楚如何通过df["col"].str.contains(word) 过滤数据帧,但是我想知道是否有相反的方法:通过该集合的恭维过滤数据帧。例如:大意为!(df["col"].str.contains(word))。
这可以通过DataFrame 方法完成吗?
【问题讨论】:
我已经进行了一些搜索,但无法弄清楚如何通过df["col"].str.contains(word) 过滤数据帧,但是我想知道是否有相反的方法:通过该集合的恭维过滤数据帧。例如:大意为!(df["col"].str.contains(word))。
这可以通过DataFrame 方法完成吗?
【问题讨论】:
您可以使用反转 (~) 运算符(其作用类似于布尔数据的 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]
【讨论】:
re.complies 的文章,并告诉自己我稍后会谈到。看起来我过度拟合了搜索,就像你说的那样:)
df[~df.col.str.contains(word)] 返回原始数据帧的副本,其中包含与单词匹配的排除行。
在使用上面 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 值,然后重试该命令没有问题。
【讨论】:
~df["second"].astype(str).str.contains(word)强制转换为str。见stackoverflow.com/questions/43568760/…
我也遇到了非 (~) 符号的问题,所以这是另一个 StackOverflow thread 的另一种方法:
df[df["col"].str.contains('this|that')==False]
【讨论】:
df[df["col1"].str.contains('this'|'that')==False and df["col2"].str.contains('foo'|'bar')==True]?谢谢!
df = df[~df["col"].str.contains('\|')]
除了 nanselm2 的回答,您可以使用 0 代替 False:
df["col"].str.contains(word)==0
【讨论】:
NaN的所有行
您可以使用 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 = 数据帧
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))]
【讨论】: