【问题标题】: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]

【问题讨论】:

    标签: python sql pandas dataframe


    【解决方案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(如果您想要特定索引而不是布尔值系列)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-05-30
            • 1970-01-01
            • 1970-01-01
            • 2014-12-13
            • 2019-01-24
            • 2018-08-29
            相关资源
            最近更新 更多