在 Pandas 查询中使用列表

Wil*_*ade 6 python list pandas

我正在对 DataFrame 执行查询:

Index Category
1     Foo
2     Bar
3     Cho
4     Foo
Run Code Online (Sandbox Code Playgroud)

我想返回类别为“Foo”或“Bar”的行。当我使用代码时:

df.query("Catergory==['Foo','Bar']")
Run Code Online (Sandbox Code Playgroud)

这工作正常并返回:

Index Category
1     Foo
2     Bar
4     Foo
Run Code Online (Sandbox Code Playgroud)

但是,将来我希望动态更改过滤器,所以我写道:

filter_list=['Foo','Bar']
df.query("Catergory==filter_list")
Run Code Online (Sandbox Code Playgroud)

哪个抛出了错误:

UndefinedVariableError: name 'filter_list' is not defined
Run Code Online (Sandbox Code Playgroud)

我尝试过但没有成功的其他变体是:

df.query("Catergory"==filter_list)
df.query("Catergory=="filter_list)
Run Code Online (Sandbox Code Playgroud)

分别生产:

ValueError: expr must be a string to be evaluated, <class 'bool'> given
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

Sco*_*ton 11

使用@以参考变量query

filter_list=['Foo','Bar']

df.query("Category == @filter_list")
Run Code Online (Sandbox Code Playgroud)

输出:

   Index Category
0      1      Foo
1      2      Bar
3      4      Foo
Run Code Online (Sandbox Code Playgroud)


Erf*_*fan 7

使用isin方法。

df.query('Category.isin(@filter_list)')
Run Code Online (Sandbox Code Playgroud)

  • 我发现这种语法比接受的答案更清晰(我期望确切的列表相等)。在 Pandas 版本 1.2.4 中为我工作。 (4认同)

sam*_*dai 5

尝试这个:

df = pd.DataFrame({'Index':[1,2,3,4],'Category':['Foo','Bar','Cho','Foo']})
filter_list = ['Foo','Bar']

df.query(f'Catergory=={filter_list}')
Run Code Online (Sandbox Code Playgroud)

  • 也可以写````df.query(f'Category in {filter_list}')```,这样可能可读性更好 (4认同)