Pandas - pandas查询中类似于str.contains()的等效方法

15

使用以下条件进行子集创建数据框

subset_df = df_eq.loc[(df_eq['place'].str.contains('Chile')) & (df_eq['mag'] > 7.5),['time','latitude','longitude','mag','place']]

想使用Pandas中的query()函数复制上述子集。但不确定如何在Pandas query中复制str.contains()等价物。query中的"like"似乎无法正常工作。

想在 Pandas 的 query() 函数中用类似 str.contains() 的方式筛选子集,但是不确定如何实现。用 query() 中的 "like" 似乎不能达到同样的效果。

query_df = df_eq[['time','latitude','longitude','mag','place']].query('place like \'%Chile\' and mag > 7.5')

place like '%Chile'and mag >7.5 
            ^
SyntaxError: invalid syntax

任何帮助都将不胜感激


我在这里试图寻找答案,但你可能可以使用Python的in运算符,如果你设置engine='python'。如果它能够工作,那么很可能会得到一个相当低效的查询(通常pandas尝试使用numexpr来加速查询,但是numexpr不支持in运算符...)。 - mgilson
3
据我所知,Pandas的query()方法中尚未实现SQL的like运算符,因此您无法使用query()方法来执行此操作。 - MaxU - stand with Ukraine
感谢您的评论。是的,像运算符不在那里,所以解决方法仍然是使用str.contains()。 - raul
来自智利的问候,我想知道为什么在这种情况下你使用.iloc,以下内容应该足够了df_eq[(df_eq['place'].str.contains('Chile')) & (df_eq['mag'] > 7.5)][['time','latitude','longitude','mag','place']] - rpanai
3个回答

12

目前,我可以通过在查询中使用engine='python'参数并使用str.contains来实现此操作。

应该可以这样做:

query_df = df_eq[['time', 'latitude', 'longitude', 'mag', 'place']].query(
    "place.str.contains('Chile') and mag > 7.5", engine="python")

9
我认为这里的情况是您无法在pandas方法query中使用str.contains方法。您可以创建掩码,并使用at符号(@)从query中引用该掩码。尝试这样做:
my_mask = df_eq["feature"].str.contains('my_word')
df_eq.query("@my_mask")

适用于在我的 my_mask 命令中进行代码完成,但不适用于在我的 jupyter-lab 中的查询字符串。 - Justislav Bogevolnov

7

在pandas 1.0.0中,使用str.contains这个语法适用于我:

df.query("columnA == 'foo' and columnB.str.contains('bar')")

1
检查是否安装了“numexpr”模块。如果没有,则使用默认的“python”引擎,其中str.contains是有效表达式。 - ARA1307

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接