'iterating different length arrays and replace values

I have a dataframe that looks like this:

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]]

I also have another array (a):

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

I want to replace the value in every second position from df with values from a. So for example, I want to make dataframe that looks like this (every second value is changed from each array):

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

This is how I approached it:

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)

which result in :

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

Can anyone please help me how to figure this problem out?? Thanks in advance!



Solution 1:[1]

You shouldn't be looping over a with a nested loop, as that will create a cross product. Just increment an index variable and use that to get the next element of the array.

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)

Solution 2:[2]

A simple way could be to transform the array into an iterator:

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

NB. using here the original value as default in case the array is shorter than the number of sublists

output:

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

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Barmar
Solution 2 mozway