Добавление нескольких столбцов к pandas одновременно
Я новичок в pandas и пытаюсь выяснить, как добавить несколько столбцов в pandas одновременно. Любая помощь здесь ценится. В идеале я хотел бы сделать это за один шаг, а не за несколько повторяющихся шагов...
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...
Ответы
Ответ 1
Я бы ожидал, что ваш синтаксис тоже будет работать. Проблема возникает из-за того, что когда вы создаете новые столбцы с синтаксисом списка столбцов (df[[new1, new2]] = ...
), pandas требует, чтобы правая сторона была DataFrame (обратите внимание, что на самом деле не имеет значения, имеют ли столбцы DataFrame те же имена, что и столбцы, которые вы создаете).
Ваш синтаксис отлично подходит для назначения скалярных значений существующим столбцам, а pandas также с удовольствием присваивает скалярные значения новому столбцу, используя синтаксис с одним столбцом (df[new1] = ...
). Таким образом, решение состоит в том, чтобы преобразовать это в несколько назначений с одним столбцом или создать подходящий DataFrame для правой стороны.
Вот несколько подходов, которые будут работать:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]
})
Затем одно из следующего:
(1) Технически это три шага, но это выглядит как один шаг:
df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
(2) DataFrame
удобно расширяет одну строку для соответствия индексу, поэтому вы можете сделать это:
df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
(3) Это будет хорошо работать, если вы создадите временный фрейм данных с новыми столбцами, затем соедините с исходным фреймом данных позже:
df = pd.concat(
[
df,
pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
)
], axis=1
)
(4) Как и предыдущий, но используя join
вместо concat
(может быть менее эффективным):
df = df.join(pd.DataFrame(
[[np.nan, 'dogs', 3]],
index=df.index,
columns=['column_new_1', 'column_new_2', 'column_new_3']
))
(5) Это более "естественный" способ создать новый кадр данных, чем предыдущие, но новые столбцы будут отсортированы в алфавитном порядке (как минимум до Python 3.6 или 3.7):
df = df.join(pd.DataFrame(
{
'column_new_1': np.nan,
'column_new_2': 'dogs',
'column_new_3': 3
}, index=df.index
))
(6) Мне нравится этот вариант на @zero много, но, как и предыдущий, новые столбцы всегда будут отсортированы по алфавиту, по крайней мере, с ранними версиями Python:
df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)
(7) Это интересно (на основе fooobar.com/questions/62849/...), но я не знаю, когда это было бы полезно:
new_cols = ['column_new_1', 'column_new_2', 'column_new_3']
new_vals = [np.nan, 'dogs', 3]
df = df.reindex(columns=df.columns.tolist() + new_cols) # add empty cols
df[new_cols] = new_vals # multi-column assignment works for existing cols
(8) В конце концов это сложно превзойти:
df['column_new_1'] = np.nan
df['column_new_2'] = 'dogs'
df['column_new_3'] = 3
Примечание. Многие из этих параметров уже были рассмотрены в других ответах: Добавить несколько столбцов в DataFrame и установить их равными существующим столбцам, Можно ли сразу добавить несколько столбцов в pandas DataFrame?, Pandas: добавить несколько пустых столбцов в DataFrame
Ответ 2
Вы можете использовать assign
с указанием имен столбцов и значений.
In [1069]: df.assign(**{'col_new_1': np.nan, 'col2_new_2': 'dogs', 'col3_new_3': 3})
Out[1069]:
col_1 col_2 col2_new_2 col3_new_3 col_new_1
0 0 4 dogs 3 NaN
1 1 5 dogs 3 NaN
2 2 6 dogs 3 NaN
3 3 7 dogs 3 NaN
Ответ 3
С помощью concat:
In [128]: df
Out[128]:
col_1 col_2
0 0 4
1 1 5
2 2 6
3 3 7
In [129]: pd.concat([df, pd.DataFrame(columns = [ 'column_new_1', 'column_new_2','column_new_3'])])
Out[129]:
col_1 col_2 column_new_1 column_new_2 column_new_3
0 0.0 4.0 NaN NaN NaN
1 1.0 5.0 NaN NaN NaN
2 2.0 6.0 NaN NaN NaN
3 3.0 7.0 NaN NaN NaN
Не уверен, что вы хотели сделать с [np.nan, 'dogs',3]
. Может быть, теперь установите их как значения по умолчанию?
In [142]: df1 = pd.concat([df, pd.DataFrame(columns = [ 'column_new_1', 'column_new_2','column_new_3'])])
In [143]: df1[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs', 3]
In [144]: df1
Out[144]:
col_1 col_2 column_new_1 column_new_2 column_new_3
0 0.0 4.0 NaN dogs 3
1 1.0 5.0 NaN dogs 3
2 2.0 6.0 NaN dogs 3
3 3.0 7.0 NaN dogs 3
Ответ 4
использование понимания списка, pd.DataFrame
и pd.concat
pd.concat(
[
df,
pd.DataFrame(
[[np.nan, 'dogs', 3] for _ in range(df.shape[0])],
df.index, ['column_new_1', 'column_new_2','column_new_3']
)
], axis=1)
![введите описание изображения здесь]()
Ответ 5
Просто хочу указать, что option2 в ответе @Matthias Fripp
(2) Я бы не ожидал, что DataFrame будет работать таким образом, но он
df [['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index = df.index)
уже зарегистрировано в pandas собственной документации
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
Вы можете передать список столбцов в [], чтобы выбрать столбцы в этом порядке. Если столбец не содержится в DataFrame, будет создано исключение. Несколько столбцов также могут быть установлены таким образом.Вы можете найти это полезным для применения преобразования (на месте) к подмножеству столбцов.
Ответ 6
df = pd.DataFrame(columns = ['column1','column2'])
Ответ 7
если добавить много пропущенных столбцов (a, b, c,....) с одинаковым значением, здесь 0, я сделал это:
new_cols = ["a", "b", "c" ]
df[new_cols] = pd.DataFrame([[0] * len(new_cols)], index=df.index)
Это основано на втором варианте принятого ответа.
Ответ 8
Если вы просто хотите добавить пустые новые столбцы, Reindex сделает всю работу
df
col_1 col_2
0 0 4
1 1 5
2 2 6
3 3 7
df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)
col_1 col_2 column_new_1 column_new_2 column_new_3
0 0 4 NaN NaN NaN
1 1 5 NaN NaN NaN
2 2 6 NaN NaN NaN
3 3 7 NaN NaN NaN
пример полного кода
import numpy as np
import pandas as pd
df = {'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
print('df',df, sep='\n')
print()
df=df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)
print('''df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)''',df, sep='\n')
в противном случае перейдите на нули ответ с присвоить