我有一个多索引的DataFrame,我试图过滤并分配给相应的变量。过滤我的DataFrame的代码返回预期的结果,如果我在不使用for循环的情况下输出所有内容,或者如果我要求for循环到print
而不是分配给变量它按预期工作,但由于某种原因它返回当我使用循环分配变量时ValueError: Not enough values to unpack (expected 8, got 3)
。
idx = pd.IndexSlice
vars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
for v in vars:
a, b, c, d, e, f, g, h = df.loc[:,idx[:,[v, 'Column 1']]]
我错过了什么?
答案 0 :(得分:3)
我认为您正在尝试使用字符串分配变量名称。尝试摆脱for循环并将其置于列表理解中。
idx = pd.IndexSlice
vars = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
a, b, c, d, e, f, g, h = [df.loc[:,idx[:,[v, 'Column 1']]] for v in vars]
你在做什么
for v in vars: # evaluates each v 1 at a time
... = df.loc[:,idx[:,[v, 'Column 1']]] # returns 1 item corresponding to current v
因为你的df.loc[...]
一次评估每个v
1,所以没有任何“解包”,你不能从x = 11
这样的变量中解包8个变量,因为它只是1项。
请注意,如果您的df.loc[...
返回了8个项目的集合,则会将这8个项目分解为a
... h
覆盖他们每一次。
我做了什么
a, b, c, d, e, f, g, h = [df.loc[:,idx[:,[v, 'Column 1']]] for v in vars] # returns _collection_ of 8 items
使用列表推导我只是立即执行所有df.loc
个查询,返回8个结果的集合。由于=
分配的右侧现在有8个项目,因此解压缩工作正常。