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 新手看来,最合理的做法如下:
- 创建一个函数来定位参与计算的所有值并计算差值
- 有函数return三个列表:参与运算的两个索引和结果
- 将这三个列表存储在 df 中,如 this 其他线程中的精彩建议。
我正在使用以下代码:
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()):
我有一个pandas df,我想计算某一列的值之间所有可能的差异,同时保留生成每个差异值的行的索引。
在我的 python 新手看来,最合理的做法如下:
- 创建一个函数来定位参与计算的所有值并计算差值
- 有函数return三个列表:参与运算的两个索引和结果
- 将这三个列表存储在 df 中,如 this 其他线程中的精彩建议。 我正在使用以下代码:
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()):