迭代不同长度的数组并替换值

iterating different length arrays and replace values

我有一个如下所示的数据框:

df = pd.DataFrame({'col1': [[[1,5,3],[0,0,0]], [[1,2,3],[0,0,0], [1,2,3]]]})

# which looks like this:
    col1
0   [[1, 5, 3], [0, 0, 0]]
1   [[1, 2, 3], [0, 0, 0], [1, 2, 3]]

我还有一个数组(a):

a = np.array([[1], [2], [3], [4], [5]])

我想用a中的值替换df中每隔一个位置的值。 因此,例如,我想制作如下所示的数据框(每个数组的每个第二个值都发生变化):

    col1
0   [[1, 1, 3], [0, 2, 0]]
1   [[1, 3, 3], [0, 4, 0], [1, 5, 3]]

我是这样处理的:

for i in range(len(df)):
    temp = df.loc[i, "col1"]
    for k in range(len(a)):
        for j in range(len(temp)):
            temp[j][1] = a[k][0]
    print(temp)

这导致:

[[1, 5, 3], [0, 5, 0]]
[[1, 5, 3], [0, 5, 0], [1, 5, 3]]

谁能帮我解决这个问题?? 提前致谢!

您不应该使用嵌套循环遍历 a,因为这会产生叉积。只需增加一个索引变量并使用它来获取数组的下一个元素。

k = 0
for i in range(len(df)):
    temp = df.loc[i, "col1"]
    for j in range(len(temp)):
        temp[j][1] = a[k][0]
        k += 1
    print(temp)

一种简单的方法是将数组转换为迭代器:

i = iter(a.ravel())
for L in df['col1']:
    for l in L:
        l[1] = next(i, l[1])

注意。此处使用原始值作为默认值,以防数组短于子列表的数量

输出:

                                col1
0             [[1, 1, 3], [0, 2, 0]]
1  [[1, 3, 3], [0, 4, 0], [1, 5, 3]]