Добавить несколько пустых столбцов в панды DataFrame - программирование
Подтвердить что ты не робот

Добавить несколько пустых столбцов в панды DataFrame

Это может быть глупый вопрос, но как добавить несколько лишних столбцов в DataFrame из списка?

Я могу сделать:

df["B"] = None
df["C"] = None
df["D"] = None

Но я не могу:

df[["B", "C", "D"]] = None

KeyError: "['B' 'C' 'D'] not in index"
4b9b3361

Ответ 1

Я бы 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 может быть предпочтительным, когда производительность имеет решающее значение.

Ответ 2

Вы можете использовать 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

Ответ 3

Если вы не хотите переписывать имя старых столбцов, вы можете использовать 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

Ответ 4

Я просто добавлю это небольшое решение для распаковки словаря с помощью 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

Который немного глоток.

Ответ 5

Почему бы просто не использовать цикл:

for newcol in ['B','C','D']:
    df[newcol]=0