Это может быть глупый вопрос, но как добавить несколько лишних столбцов в DataFrame из списка?
Я могу сделать:
df["B"] = None
df["C"] = None
df["D"] = None
Но я не могу:
df[["B", "C", "D"]] = None
KeyError: "['B' 'C' 'D'] not in index"
Это может быть глупый вопрос, но как добавить несколько лишних столбцов в DataFrame из списка?
Я могу сделать:
df["B"] = None
df["C"] = None
df["D"] = None
Но я не могу:
df[["B", "C", "D"]] = None
KeyError: "['B' 'C' 'D'] not in index"
Я бы concat
с использованием DataFrame:
In [23]:
df = pd.DataFrame(columns=['A'])
df
Out[23]:
Empty DataFrame
Columns: [A]
Index: []
In [24]:
pd.concat([df,pd.DataFrame(columns=list('BCD'))])
Out[24]:
Empty DataFrame
Columns: [A, B, C, D]
Index: []
Таким образом, передавая список, содержащий ваш исходный файл df и новый столбец со столбцами, которые вы хотите добавить, вы получите новый файл df с дополнительными столбцами.
Предостережение: смотрите обсуждение производительности в других ответах и/или комментариях обсуждений. reindex
может быть предпочтительным, когда производительность имеет решающее значение.
Вы можете использовать df.reindex
для добавления новых столбцов:
In [18]: df = pd.DataFrame(np.random.randint(10, size=(5,1)), columns=['A'])
In [19]: df
Out[19]:
A
0 4
1 7
2 0
3 7
4 6
In [20]: df.reindex(columns=list('ABCD'))
Out[20]:
A B C D
0 4 NaN NaN NaN
1 7 NaN NaN NaN
2 0 NaN NaN NaN
3 7 NaN NaN NaN
4 6 NaN NaN NaN
reindex
вернет новый DataFrame с столбцами, появляющимися в том порядке, в котором они перечислены:
In [31]: df.reindex(columns=list('DCBA'))
Out[31]:
D C B A
0 NaN NaN NaN 4
1 NaN NaN NaN 7
2 NaN NaN NaN 0
3 NaN NaN NaN 7
4 NaN NaN NaN 6
Метод reindex
как параметр fill_value
:
In [22]: df.reindex(columns=list('ABCD'), fill_value=0)
Out[22]:
A B C D
0 4 0 0 0
1 7 0 0 0
2 0 0 0 0
3 7 0 0 0
4 6 0 0 0
Если вы не хотите переписывать имя старых столбцов, вы можете использовать reindex:
df.reindex(columns=[*df.columns.tolist(), 'new_column1', 'new_column2'], fill_value=0)
Полный пример:
In [1]: df = pd.DataFrame(np.random.randint(10, size=(3,1)), columns=['A'])
In [1]: df
Out[1]:
A
0 4
1 7
2 0
In [2]: df.reindex(columns=[*df.columns.tolist(), 'col1', 'col2'], fill_value=0)
Out[2]:
A col1 col2
0 1 0 0
1 2 0 0
И если у вас уже есть список с именами столбцов:
In [3]: my_cols_list=['col1','col2']
In [4]: df.reindex(columns=[*df.columns.tolist(), *my_cols_list], fill_value=0)
Out[4]:
A col1 col2
0 1 0 0
1 2 0 0
Я просто добавлю это небольшое решение для распаковки словаря с помощью DataFrame.assign
.
df.assign(**dict.fromkeys('BCD', np.nan))
price B C D
0 10 NaN NaN NaN
1 13 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 9 NaN NaN NaN
Преимущество в том, что вам нужно знать только имена новых столбцов. С reindex
, когда вы пытаетесь не жестко, вы должны сделать
newcols = ['A', 'B']
df.reindex([*df.columns, *newcols], axis=1)
price A B
0 10 NaN NaN
1 13 NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 9 NaN NaN
Который немного глоток.
Почему бы просто не использовать цикл:
for newcol in ['B','C','D']:
df[newcol]=0