Pandas查询函数无法处理列名中包含空格的情况。

64

我有一个数据框,其中列名包含空格。 我试图使用query方法获取结果。 它与“c”列正常工作,但在“a b”列上出现错误。


import pandas as pd
a = pd.DataFrame(columns=["a b", "c"])
a["a b"] = [1,2,3,4]
a["c"] = [5,6,7,8]
a.query('a b==5')

我遇到了以下错误:

a b ==5
  ^
SyntaxError: invalid syntax

我不希望用其他字符如'_'等来填充空格。

有一个使用pandasql的技巧,将变量名放在方括号中,例如:[a b]

6个回答

95
从pandas 0.25开始,您可以使用反引号转义列名,以便执行以下操作:
a.query('`a b` == 5') 

2
简单易懂,非常好的解决方案。谢谢! - Pablo Adames
如果一列中有一个字符串数字“1”,我们需要使用“:a.query(' 1 == 5')”。 - Alexey K.
如果我有一列列名怎么办?我有一个变量存储了这些名字的列表,它们之间有空格。我尝试使用不同的方法和反引号,但它们都不起作用。 - Mazhar Ali

37

Pandas 0.25+

根据这里的描述:

DataFrame.query()DataFrame.eval() 现在支持使用反引号引用带空格的列名(GH6508

所以您可以使用以下代码:

a.query('`a b`==5')

早期版本的Pandas(0.25以下)

如果您的列名中有空格,您将无法使用pd.DataFrame.query。请考虑如果您有列名为aba b的情况,会产生歧义,您需要什么。

相反,您可以使用pd.DataFrame.loc

df = df.loc[df['a b'] == 5]

由于您只需要过滤行,因此可以完全省略 .loc 访问器:

df = df[df['a b'] == 5]

2
目前还不可能。请查看github issue #6508
注意,实际上.query只是一个很好用的接口,它具有非常特定的保证,这意味着它应该像查询语言一样解析,而不是一个完全通用的接口。
原因是query需要字符串作为有效的Python表达式,因此列名必须是有效的Python标识符。
解决方案是布尔索引
df = df[df['a b'] == 5]

1

我担心查询方法不接受带有空格的列名。无论如何,您可以以这种方式查询数据框:

import pandas as pd
a = pd.DataFrame({'a b':[1,2,3,4], 'c':[5,6,7,8]})
a[a['a b']==1]

0

不要使用pandas.query函数,我会在这种情况下创建一个条件来查找值,并且当条件为True时。例如:

import pandas as pd
a = pd.DataFrame(columns=["a b", "c"])
a["a b"] = [1,2,3,5]
a["c"] = [5,6,7,8]
#a.query('a b==5') Remove the query because it cannot lookup columns with spaces in the name.

condition = a['a b'] == 5
print(a['a b'][condition])

output:

    3    5

我们看到在索引3处,您的条件评估为真(如果您想要特定的索引而不是布尔值系列)。

0
更简单的方法:
df[
    (df['column name 1'] == 10)
    & (df['column name 2'] > 4)
]

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