Заполнение значений датафрейма через цикл
Требуется заполнить датафрейм списком, изменяющимся через цикл. Ожидается что на выходе будет датафрейм со следующими строками:
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 записался полный список и как это исправить?
Ответы (3 шт):
Автор решения: Censor
→ Ссылка
Вопрос решился добавлением в датафрейм не самого списка, а его копии (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)
Автор решения: strawdog
→ Ссылка
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]
Автор решения: Алексей Р
→ Ссылка
Однострочник. Можно создать фрейм с помощью генератора, формирующего списки.
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]