Почему в цикле добавляется только последний элемент списка?
Мне нужно перебрать таблицы, которые хранятся в списке dictinary и года, которые хранятся в списке dictinary_year. Проблема в том, что в результате в каждую таблицу добавляется последнее значение из списка.
dictinary = [data,data_2,data_3]
dictinary = ["2014_3","2014_4","2021_3"]
for i in range(len(dictinary)):
for n in range(len(dictinary_year)):
dictinary[i].loc[:,"year"] = dictinary_year[n]
Ответы (3 шт):
Вы два раза выполняете присваивание переменной dictinary:
dictinary = [data,data_2,data_3]
dictinary = ["2014_3","2014_4","2021_3"]
и ни разу - переменной dictinary_year
Почему в цикле добавляется только последний элемент списка?
Потому, что вы делаете присваивание одного элемента всему столбцу. Т.е. одно и то же значение будет присвоено всем элементам столбца. Соответственно в столбце "year" в каждом фрейме окажется последнее значение из dictinary_year.
Кроме этого Numpy и Pandas придумали для того, чтобы облегчить у ускорить работу с матрицами и табличными данными. Сделано это за счет введения быстрых векторизированных функций, которые позволяют оперировать сразу векторами и матрицами, вместо медленной поэлементной обработки в циклах. Воспользуйтесь этой мощью:
for i in range(len(dictinary)):
dictinary[i]["year"] = dictinary_year[i]
PS вы не объяснили что вы хотите сделать/получить, поэтому нам приходится гадать по вашему нерабочему коду. Это очень неэффективно. Прочтите пожалуйста как наиболее эффективно задать вопрос, связанный с обработкой и/или анализом данных (например: по Pandas / Numpy / SciPy / SciKit Learn / SQL) и следуйте в будущих вопросах рекомендациям из этого FAQ.
Хочу дополнить уже имеющиеся ответы. Не используйте циклы вида for i in range(len(collection)), если всё, для чего вам нужна переменная i - это получить доступ к элементу collection[i]. Есть же простой и понятный цикл, перебирающий элементы коллекции: for item in collection. Так и короче, и понятнее, и в индексах не запутаетесь, особенно если циклы вложенные и индексов много. А для одновременного перебора нескольких коллекций одинаковой длины есть функция zip.
Применительно к вашему случаю, правда, не могу точный код написать, потому что не совсем понятно, что вы делаете. Но предположу, что планировалось что-то такое:
dictinary = [data,data_2,data_3]
dictinary_year = ["2014_3","2014_4","2021_3"]
for dic,year in zip(dictinary, dictinary_year):
dic["year"] = year