Construct a pandas df from lists, ValueError: too many values to unpack (expected 3)

Construct a pandas df from lists, ValueError: too many values to unpack (expected 3)

我有一个pandas df,我想计算某一列的值之间所有可能的差异,同时保留生成每个差异值的行的索引。

在我的 python 新手看来,最合理的做法如下:

ind1 = []
ind2 = []
delta = []
def calculator(): # id stands for index
    for i in range(len(df)):
        for j in range(len(df)):
            v1 = df.loc[i, 'col']
            v2 = df.loc[j, 'col']
            dv = abs(v1-v2)
            delta.append(dv)
            ind1.append(i)
            ind2.append(j)
    return ind1, ind2, delta

构建新的df时出现问题,因为我遇到了解包问题:

data = []
for ind1, ind2, delta in calculator():
    data.append([ind1, ind2, delta])
new_df = pd.DataFrame(data, columns=['ind1', 'ind2', 'delta'])

returns:

ValueError: too many values to unpack (expected 3)

关于如何解决这个问题的任何想法,同时按照 other thread 中的指示正确构建 df?

for 并不像您预期​​的那样工作。 考虑以下玩具示例:

for x,y,z in [[1,2,3], [4,5,6], [7,8,9]]:
    print(x,y,z)

您希望输出为:

1 4 7
2 5 8
3 6 9

但你得到的是

1 2 3
4 5 6
7 8 9

发生这种情况是因为循环迭代了您列表中的每个项目,这是一个单独的列表,并试图将其扩展到您的 3 个参数中,这些参数可能存在也可能不存在。要转置列表(列表),您可以像这样使用内置 zip

for x,y,z in zip(*[[1,2,3], [4,5,6], [7,8,9]]):
    print(x,y,z)

或者在您的具体情况下:

for ind1, ind2, delta in zip(*calculator()):