Pandas查询功能不适用于列名中的空格

时间:2018-06-05 10:11:23

标签: python sql pandas dataframe

我在列名中有一个带空格的数据框。我正在尝试使用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

我不想用其他字符填充空格,例如'_'等。

有一个hack使用pandasql将变量名放在括号示例中: [a b]

5 个答案:

答案 0 :(得分:6)

Pandas 0.25 +

如上所述here

  

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

所以你可以使用:

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

Pandas pre-0.25

如果列名中有空格,则无法使用pd.DataFrame.query。考虑如果您的列名为aba b会发生什么情况;你需要什么就会含糊不清。

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

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

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

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

答案 1 :(得分:2)

目前还不可能。检查github issue #6508

  

请注意,实际上 .query 只是一个很好用的界面,实际上它有非常具体的保证,这意味着它的意思是像查询语言一样解析,而不是一个完全通用的界面

原因是public interface UserRepository extends JpaRepository<User, Long> { @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1", countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1", nativeQuery = true) Page<User> findByLastname(String lastname, Pageable pageable); } 需要字符串是有效的python表达式,因此列名必须是有效的python标识符。

解决方案是boolean indexing

query

答案 2 :(得分:1)

从熊猫0.25开始,您将能够使用反引号对列名进行转义,从而可以

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

答案 3 :(得分:0)

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

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]

输出:

3    5

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

答案 4 :(得分:0)

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

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