熊猫查询功能不适用于列名中的空格
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
。考虑一下如果有名为a
、b
和a 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(如果您想要特定索引而不是布尔值系列)。
【讨论】:
以上是关于熊猫查询功能不适用于列名中的空格的主要内容,如果未能解决你的问题,请参考以下文章