我有两个数据帧
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}}
答案 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
受到许多限制,主要是围绕变量名称的限制。