在MultiIndex上使用df.query会产生UndefinedVariableError

时间:2018-01-08 22:33:11

标签: 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]: 
               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 个答案:

答案 0 :(得分:4)

考虑 -

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中的关键字,当pandas 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受到许多限制,主要是围绕变量名称的限制。