Python循环似乎有效但仍然得到ValueError:没有足够的值来解压缩

时间:2018-01-05 17:41:46

标签: python pandas loops dataframe

我有一个多索引的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']]]

我错过了什么?

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个项目,因此解压缩工作正常。