Я новичок в пандах и пытаюсь понять, как одновременно добавить несколько столбцов в панды. Любая помощь здесь приветствуется. В идеале я хотел бы сделать это за один шаг, а не за несколько повторяющихся шагов ...
import pandas as pd
df = {'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3] #thought this would work here...
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
Ответы:
Я ожидал, что ваш синтаксис тоже будет работать. Проблема возникает из-за того, что при создании новых столбцов с синтаксисом списка столбцов (
df[[new1, new2]] = ...
) pandas требует, чтобы правая сторона была DataFrame (обратите внимание, что на самом деле не имеет значения, имеют ли столбцы DataFrame те же имена, что и столбцы вы создаете).Ваш синтаксис отлично подходит для присвоения скалярных значений существующим столбцам, и pandas также с радостью назначает скалярные значения новому столбцу, используя синтаксис одного столбца (
df[new1] = ...
). Таким образом, решение состоит в том, чтобы либо преобразовать это в несколько назначений с одним столбцом, либо создать подходящий DataFrame для правой стороны.Вот несколько подходов, которые будут работать:
Тогда одно из следующего:
1) Три присваивания в одном, используя распаковку списка:
2)
DataFrame
удобно расширяет одну строку в соответствии с индексом, поэтому вы можете сделать это:3) Создайте временный фрейм данных с новыми столбцами, а затем объедините его с исходным фреймом данных позже:
4) Аналогично предыдущему, но с использованием
join
вместоconcat
(может быть менее эффективным):5) Использование dict - более «естественный» способ создания нового фрейма данных, чем два предыдущих, но новые столбцы будут отсортированы в алфавитном порядке (по крайней мере, до Python 3.6 или 3.7 ):
6) Используйте
.assign()
с несколькими аргументами столбца.Мне очень нравится этот вариант ответа @ zero, но, как и предыдущий, новые столбцы всегда будут отсортированы в алфавитном порядке, по крайней мере, в ранних версиях Python:
7) Это интересно (на основе https://stackoverflow.com/a/44951376/3830997 ), но я не знаю, когда это того стоит:
8) В конце концов, сложно пройти три отдельных задания:
Примечание: многие из этих параметров уже были рассмотрены в других ответах: добавить несколько столбцов в DataFrame и установить их равными существующему столбцу , можно ли добавить сразу несколько столбцов в DataFrame pandas? , Добавить несколько пустых столбцов в pandas DataFrame
источник
.reindex
) изменить индекс фрейма данных? Зачем кому-то без нужды изменять индекс при добавлении столбцов, если это не явная цель ....reindex()
используется сcolumns
аргументом, поэтому он изменяет только "индекс" столбца (имена). Это не меняет индекс строки.OrderedDict
: например,df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})
vs.df = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
join
, убедитесь, что у вас нет дубликатов в вашем индексе (или используйтеreset_index
первый). Может сэкономить несколько часов на отладке.Вы можете использовать
assign
с диктовкой имен столбцов и значений.источник
df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
df.assign(col_new_1=np.nan, col2_new_2='dogs', col3_new_3=3)
. Это поддерживает порядок.С использованием concat :
Не очень уверен, что ты хочешь делать
[np.nan, 'dogs',3]
. Может теперь выставить их как значения по умолчанию?источник
использование понимания списков
pd.DataFrame
иpd.concat
источник
если добавить много пропущенных столбцов (a, b, c, ....) с тем же значением, здесь 0, я сделал следующее:
Он основан на втором варианте принятого ответа.
источник
Просто хочу указать на этот вариант2 в ответе @Matthias Fripp
уже задокументирован в собственной документации pandas http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
источник
pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
реплицирует одну строку, которая дается для создания целого фрейма данных той же длины, что и индекс.Если вы просто хотите добавить пустые новые столбцы, переиндекс сделает работу
полный пример кода
в противном случае выберите нулевой ответ с помощью assign
источник
Мне неудобно использовать "Индекс" и т. Д. ... может появиться как показано ниже
источник