问题 在pandas.query()中使用LIKE


我已经使用Pandas超过3个月了,我对数据帧访问和查询等方面有一个很好的想法。

我有一个要求,其中我想使用LIKE关键字(类似于SQL的LIKE)查询数据帧 pandas.query()。

即: 我试图执行 pandas.query(“column_name LIKE'abc%'”) 命令,但它失败了。

我知道另一种方法是使用str.contains(“abc%”),但这不符合我们的要求。

我们想在pandas.query()中执行LIKE。我怎么能这样做?


6102
2017-07-13 18:56


起源

自从这个问题发布以来已经有一段时间了:已找到解决方案,或者这仍然只能通过 str.contains()? - user1717828


答案:


这个帖子超级晚了,但对于遇到它的人来说。您可以通过基于字符串方法检查制作搜索条件来使用布尔索引 str.contains

例:

dataframe[dataframe.summary.str.contains('Windows Failed Login', case=False)]

在上面的代码中,括号内的代码段引用了数据框的摘要列并使用了 .str.contains 搜索方法 'Windows Failed Login' 在该系列的每个价值范围内。区分大小写可以设置为true或false。这将返回布尔索引,然后用于返回您要查找的数据帧。您可以使用 .fillna() 如果遇到任何Nan错误,也可以在括号中使用它。

希望这可以帮助!


5
2017-12-22 05:34



这是一个很好的答案!! - sushmit
我没有摘要列,因此对于随机列名称可以使用 new_df = df[df['Column'].str.contains('something')] - arie64


如果必须使用df.query(),则正确的语法是:

pandas.query('column_name.str.contains("abc")')

您可以轻松地将其与其他条件相结合:

pandas.query('column_a.str.contains("abc") or column_b.str.contains("xyz") and column_c>100')

然而,它不是SQL Like的完全等价物,但仍然有用。


5
2018-06-22 05:07





不使用query(),但这会给你你想要的东西:

df[df.col_name.str.startswith('abc')]


df
Out[93]: 
  col_name
0     this
1     that
2     abcd

df[df.col_name.str.startswith('abc')]
Out[94]: 
  col_name
2     abcd

Query使用pandas 的eval() 并限制在其中可以使用的内容。如果你想使用纯SQL,你可以考虑 pandasql 以下陈述适合您:

sqldf("select col_name from df where col_name like 'abc%';", locals())

或者如果你的问题与熊猫交替 str 方法是您的列不完全是字符串类型,您可以执行以下操作:

df[df.col_name.str.startswith('abc').fillna(False)]

2
2017-07-13 21:40



我已经尝试过SQLDF,这是解决我的问题但是我看到了它的巨大性能问题。我用常规的df.query()添加了95万个记录,我可以在1分钟内得到结果。但如果我使用SQLDF,它至少需要10分钟。 - Pradeep M
SQLDF创建并删除了一个sqlite数据库,因此性能受到了影响。有没有理由你不能使用startswith()? - khammel


@volodymyr是对的,但他忘记的是你需要将engine ='python'设置为表达式才能工作。

例: >>> pd_df.query('column_name.str.contains("abc")', engine='python')

这里 有关默认引擎('numexpr')和'python'引擎的更多信息。另外,请记住,'python'在大数据上速度较慢。


1
2017-07-17 07:23