代码之家  ›  专栏  ›  技术社区  ›  BENY

使用df。对多索引的查询给出了UndefinedVariableError

  •  3
  • BENY  · 技术社区  · 7 年前

    我有两个数据帧

    df
    Out[162]: 
              colA  colB
    L0 L1 L2            
    A1 B1 C1     1     2
          C2     3     4
       B2 C1     5     6
          C2     7     8
    A2 B3 C1     9    10
          C2    11    12
       B4 C1    13    14
          C2    15    16
    
    df1
    Out[166]: 
                   rate
    from to            
    CHF  CHF   1.000000
         MXN  19.673256
         ZAR   0.000000
         XAU   0.000775
         THB  32.961405
    

    当我这么做的时候

    df.query('L0=="A1" & L2=="C1"')
    Out[167]: 
              colA  colB
    L0 L1 L2            
    A1 B1 C1     1     2
       B2 C1     5     6
    

    这给了我预期的输出。

    然后我想在df1中应用相同的函数

    df1.query('ilevel_0=="CHF" & ilevel_1=="MXN"') 
    

    df1.query('from=="CHF" & to=="MXN"') 
    

    两个都失败了

    这里发生了什么事?


    数据输入:

    #df
    {'colA': {('A1', 'B1', 'C1'): 1,
      ('A1', 'B1', 'C2'): 3,
      ('A1', 'B2', 'C1'): 5,
      ('A1', 'B2', 'C2'): 7,
      ('A2', 'B3', 'C1'): 9,
      ('A2', 'B3', 'C2'): 11,
      ('A2', 'B4', 'C1'): 13,
      ('A2', 'B4', 'C2'): 15},
     'colB': {('A1', 'B1', 'C1'): 2,
      ('A1', 'B1', 'C2'): 4,
      ('A1', 'B2', 'C1'): 6,
      ('A1', 'B2', 'C2'): 8,
      ('A2', 'B3', 'C1'): 10,
      ('A2', 'B3', 'C2'): 12,
      ('A2', 'B4', 'C1'): 14,
      ('A2', 'B4', 'C2'): 16}}
    
    
    #df1
    {'rate': {('CHF', 'CHF'): 1.0,
    ('CHF', 'MXN'): 19.673256,
      ('CHF', 'THB'): 32.961405,
      ('CHF', 'XAU'): 0.000775,
      ('CHF', 'ZAR'): 0.0}}
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   cs95 abhishek58g    7 年前

    考虑-

    df1
    
                   rate
    from to            
    CHF  CHF   1.000000
         MXN  19.673256
         THB  32.961405
         XAU   0.000775
         ZAR   0.000000
    

    首先,原因 df1.query('ilevel_0=="CHF" & ilevel_1=="MXN"') 不起作用,是因为你的索引已经 一个名字。 ilevel_* 是在索引还没有名称时指定的名称。因此,此命令为您提供 UndefinedVariableError .

    接下来,原因 df1.query('from=="CHF" & to=="MXN"') 没用,是吗 from 是python中的一个关键字 eval 是表达式, from == ... 被视为无效语法。一种解决方法是-

    df1.rename_axis(['frm', 'to']).query("frm == 'CHF' and to == 'MXN'")
    
    
                  rate
    frm to            
    CHF MXN  19.673256
    

    另一个是去掉轴心国的名字-

    df1.rename_axis([None, None]).query("ilevel_0 == 'CHF' and ilevel_1 == 'MXN'") 
    
                  rate
    CHF MXN  19.673256
    

    请记住 query 受到许多限制,主要围绕变量名的限制。