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

Posted

技术标签:

【中文标题】熊猫查询功能不适用于列名中的空格【英文标题】:Pandas query function not working with spaces in column names 【发布时间】:2018-11-14 18:57:21 【问题描述】:

我有一个列名中有空格的数据框。我正在尝试使用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 将变量名放在括号内的 hack 示例:[a b]

【问题讨论】:

【参考方案1】:

从 pandas 0.25 开始,您将能够使用反引号转义列名,以便您可以这样做

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

【讨论】:

简单易用,很好的解决方案。谢谢! 如果一列有一个字符串数字'1',我们需要`:a.query(' ` 1 ` == 5')【参考方案2】:

熊猫 0.25+

如here所述:

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

所以你可以使用:

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

0.25 之前的 Pandas

如果列名中有空格,则不能使用pd.DataFrame.query。考虑一下如果有名为aba b 的列会发生什么;你需要什么会模棱两可。

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

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

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

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

【讨论】:

【参考方案3】:

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

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

原因是query 需要字符串是有效的 Python 表达式,因此列名必须是有效的 Python 标识符。

解决方案是boolean indexing:

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

【讨论】:

【参考方案4】:

恐怕查询方法不接受带有空格的列名。在任何情况下,您都可以通过这种方式查询数据框:

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

【讨论】:

【参考方案5】:

在这种情况下,我将创建一个条件来查找值以及条件为 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])
output:

    3    5

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

【讨论】:

以上是关于熊猫查询功能不适用于列名中的空格的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Windows START 命令不适用于参数和路径中的空格?

使用索引号同时更改熊猫数据框中的多个列名(不是所有列名)

删除不需要的字符和编辑熊猫中的列名

根据列名重新排序熊猫数据框中的列[重复]

根据列名重新排序熊猫数据框中的列[重复]

根据列名重新排序熊猫数据框中的列[重复]