我已经使用Pandas超过3个月了,我对数据帧的访问和查询等有了一个很好的想法。
我有一个要求,其中我想在 pandas.query()中使用LIKE关键字(LIKE类似于SQL)查询数据框。
即: 我试图执行 pandas.query(" column_name LIKE' abc%'")命令但是它失败了。
我知道另一种方法是使用str.contains(" abc%")但这并不符合我们的要求。
我们想在pandas.query()中执行LIKE。我怎么能这样做?
答案 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〜”。
要考虑的几件事:
答案 5 :(得分:-2)
我知道这是一篇很老的文章,但我只想把这些留给那些正在寻找答案的人。
df.query('column_name == "value"')
当我需要查询数据框以查找匹配的字符串时,这对我有用。