Python 对多索引使用df.query会产生未定义的变量错误

Python 对多索引使用df.query会产生未定义的变量错误,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我有两个数据帧 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]:

我有两个数据帧

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"') 

两次都失败了

这里发生了什么事


数据输入:

#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}}
考虑-

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中的一个关键字,当panda
eval
s表达式时,
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
受到许多限制,主要围绕变量名的限制。

因此,
from
在python中是一个保留关键字,因此在
query
中使用它是不起作用的。df1.query('ilevel_0==“CHF”&ilevel_1==“MXN”)这在我的计算机上起作用。@cᴏʟᴅsᴘᴇᴇᴅ 是的,我注意到,但是为什么ilevel_0仍然不工作…@Tai错误代码在我这边
pandas.core.computation.ops.UndefinedVariableError:name'ilevel_0'没有定义
ilevel_0
是轴没有名称时的名称。如果轴已经有名称,则需要在查询中使用该名称。另一方面,如果你做了
df1.rename_axis([None,None])
,然后调用query,你就会得到答案。与多索引相关的api,包含了太多的技巧,希望他们将来能修复:-)@Wen Yep,希望他们能让api更干净一点,或者去掉它。对我来说,我甚至想重新设置索引,而不是使用多个索引,这是痛苦的…绝妙的答案!
df1.rename_axis([None, None]).query("ilevel_0 == 'CHF' and ilevel_1 == 'MXN'") 

              rate
CHF MXN  19.673256