在pandas.query()中使用LIKE

时间:2015-07-13 18:56:10

标签: python pandas dataframe

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

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

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

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

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

6 个答案:

答案 0 :(得分:11)

如果必须使用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,但仍然很有用。

答案 1 :(得分:8)

@volodymyr是正确的,但他忘记的事情是您需要将engine ='python'设置为表达式才能工作。

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

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

答案 2 :(得分:5)

这篇文章的时间已经很晚了,但对于任何碰到它的人来说都是如此。您可以使用布尔索引,方法是根据字符串方法检查str.contains

示例:

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

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

希望这有帮助!

答案 3 :(得分:4)

不使用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

查询使用pandas eval(),并限制在其中使用的内容。如果您想使用纯SQL,可以考虑pandasql以下语句对您有用:

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

或者,如果您对pandas str方法的问题是您的专栏不完全是字符串类型,则可以执行以下操作:

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

答案 4 :(得分:1)

我刚想出的“开始于”的技巧:

pandas.query('"abc" <= column_name <= "abc~"')

说明::pandas在查询中接受字符串的“更大”和“小于”语句,因此按字母顺序排列的任何以“ abc”开头的内容都将大于或等于“ abc”。波浪号(〜)是ASCII table中的最大字符,因此以“ abc”开头的任何字符都将小于或等于“ abc〜”。

要考虑的几件事:

  • 这当然是区分大小写的。所有小写​​字符都排在ASCII表中所有大写字符之后。
  • 这不适用于Unicode字符串,但是一般原理应该相同。
  • 我无法为“包含”或“以...结尾”提供并行技巧。

答案 5 :(得分:-2)

我知道这是一篇很老的文章,但我只想把这些留给那些正在寻找答案的人。

df.query('column_name == "value"')

当我需要查询数据框以查找匹配的字符串时,这对我有用。