如何用`or`条件查询 Pandas 数据框?

5
我有一个简单的Pandas数据框。
import pandas as pd    
x = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
y = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
users =['mark', 'mark', 'mark', 'rachel', 'rachel', 'rachel', 'jeff', 'jeff', 'jeff', 'lauren', 'lauren', 'lauren']

df = pd.DataFrame(dict(x=x, y=y, users=users)

我想保留数据框的某些行。比方说所有“rachels”和“jeffs”。我尝试了df.query

df=df.query('users=="rachel"' or 'users=="jeff"')

结果是一个仅包含 users=="rachel" 的数据框。有没有一种方式可以合并查询?

df.query('(users=="rachel") or (users=="jeff")') 或者 df.query('users=="rachel" or users=="jeff"') 都可以解决问题。已测试过,使用的是 pandas==1.2.4 - banderlog013
2个回答

21

标准方式是使用位或运算符|。要了解为什么,请查看此答案中的清晰解释。由于Python的评估顺序,您还需要在每个条件周围使用括号。

df[(df.users == 'rachel') | (df.users == 'jeff')]
    users   x    y
3  rachel  30  200
4  rachel   5  300
5  rachel  10  300
6    jeff  20  400
7    jeff  30  400
8    jeff   5  500

使用查询语句,您仍然可以只使用or运算符:

df.query("users=='rachel' | users=='jeff'")
    users   x    y
3  rachel  30  200
4  rachel   5  300
5  rachel  10  300
6    jeff  20  400
7    jeff  30  400
8    jeff   5  500

没问题。@EdChum的评论也是一个简单的解决方案。 - Nick Becker
你如何创建逻辑来仅显示名称为rachel或jeff,且家乡是芝加哥的结果?因此,所有来自芝加哥的rachels和所有来自芝加哥的jeffs,但不包括来自芝加哥的steves或来自亚特兰大的rachels。你可以使用“users =='rachel' | users=='jeff' & hometown=='chicago'”吗?还是AND仅适用于jeffs,需要将“& hometown=='Chicago'”包含在OR的两侧? - Korzak
@Korzak 我不知道你现在是否需要答案,但我认为使用()就可以解决问题。因此语句应该是“(user=='rachel' | user=='jeff') & hometown == chicago”。这样内部语句将过滤名称,外部语句仅显示来自芝加哥的Rachel和Jeffs。 - Phil
@Korzak 我不知道你现在是否需要答案,但我假设使用()可以解决问题。因此,语句应为"(user=='rachel' | user=='jeff') & hometown == chicago"。通过这个内部语句将筛选出姓名,而外部语句只显示来自芝加哥的Rachel和Jeff。 - undefined

-1

另一种方法是:

df=df.query('users=="rachel"').append(df.query('users=="jeff"'))

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