Заполнение значений датафрейма через цикл

Рейтинг: 1Ответов: 3Опубликовано: 23.04.2023

Требуется заполнить датафрейм списком, изменяющимся через цикл. Ожидается что на выходе будет датафрейм со следующими строками:

x= 1 work_ls =  [1]
x= 2 work_ls =  [1, 2]
x= 3 work_ls =  [1, 2, 3]
x= 4 work_ls =  [1, 2, 3, 4]
x= 5 work_ls =  [1, 2, 3, 4, 5]

Пробую такой код:

import pandas as pd
x=0
y=0
work_ls=[]
test_result = pd.DataFrame(columns=['work_ls', 'x'])

for i in range(5):        
        x+=1
        y+=1
        work_ls.append(x)
        test_result.loc[len(test_result.index)] = [work_ls, y]
        
display(test_result)

на выходе получаю такой датафрейм:

         work_ls    x
0   [1, 2, 3, 4, 5] 1
1   [1, 2, 3, 4, 5] 2
2   [1, 2, 3, 4, 5] 3
3   [1, 2, 3, 4, 5] 4
4   [1, 2, 3, 4, 5] 5

Почему во все строки признака work_ls записался полный список и как это исправить?

Ответы

▲ 2Принят
import pandas as pd
test_result = pd.DataFrame(index=range(0,5))
test_result["x"] = test_result.index+1
test_result["work_ls"] = test_result["x"].apply(lambda x: list(range(1, x+1)))
   x          work_ls
0  1              [1]
1  2           [1, 2]
2  3        [1, 2, 3]
3  4     [1, 2, 3, 4]
4  5  [1, 2, 3, 4, 5]
▲ 2

Вопрос решился добавлением в датафрейм не самого списка, а его копии (ls = work_ls.copy()):

import pandas as pd
x=0
y=0
work_ls=[]
test_result = pd.DataFrame(columns=['work_ls', 'x'])

for i in range(5):        
        x+=1
        y+=1
        work_ls.append(x)
        ls = work_ls.copy()
        test_result.loc[len(test_result.index)] = [ls, y]
        
display(test_result)
▲ 1

Однострочник. Можно создать фрейм с помощью генератора, формирующего списки.

df = pd.Series([y for y in range(1, x+1)] for x in range(1, 6)).to_frame()
                 0
0              [1]
1           [1, 2]
2        [1, 2, 3]
3     [1, 2, 3, 4]
4  [1, 2, 3, 4, 5]