Как добавить пустой столбец в фрейм данных?

262

Какой самый простой способ добавить пустой столбец к DataFrameобъекту панды ? Лучшее, на что я наткнулся, это что-то вроде

df['foo'] = df.apply(lambda _: '', axis=1)

Есть ли менее извращенный метод?

KJo
источник
2
Вы действительно хотите столбец, содержащий пустые строки или скорее N/A?
фильм

Ответы:

420

Если я правильно понимаю, назначение должно заполнить:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN
DSM
источник
2
Этот ответ только что создал новые строки для меня.
logicbloke
@logicbloke Можете ли вы привести пример, где это происходит?
craymichael
@craymichael Это было давно, но я думаю, что у меня были столбцы с индексами чисел без имен и именованных строк, и он просто создал новую строку в конце.
logicbloke
1
Если dfпусто, вы можете использовать df['new'] = pd.Series() (см. Мой ответ ниже)
Карстен
Как добавить несколько пустых столбцов?
М. Марискал
46

Чтобы добавить ответ DSM и опираться на этот связанный вопрос , я бы разделил подход на два случая:

  • Добавление одного столбца: просто назначьте пустые значения новым столбцам, например df['C'] = np.nan

  • Добавление нескольких столбцов. Я бы предложил использовать .reindex(columns=[...]) метод панд, чтобы добавить новые столбцы в индекс столбцов данных. Это также работает для добавления нескольких новых строк с .reindex(rows=[...]). Обратите внимание, что более новые версии Pandas (v> 0,20) позволяют вам указывать axisключевое слово, а не явно назначать columnsили rows.

Вот пример добавления нескольких столбцов:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

или

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

Вы также всегда можете объединить новый (пустой) фрейм данных с существующим фреймом данных, но это не выглядит для меня питонным :)

emunsing
источник
3
Пример для version >= 0.20.0удаления DataFrame и добавления новых столбцов в виде строк. Пример version < 0.20.0отлично работает на Pandas Version0.24.1
Lalo
@emunsing При поиске ответа на этот вопрос я в конечном итоге нашел ваш ответ полезным. Во - первых, однако, она не работает для меня , как панды требует , axis=1в version = 0.25. Я попытался изменить ваш ответ, включив в него обновленную версию, но я был отклонен @kenlukas и @il_raffa. Я надеюсь, что все изо всех сил пытаются понять, почему ваш ответ не работает для них - как я - по крайней мере сталкивался с этим комментарием.
Грифф
@Griff - я обновил свой ответ, чтобы быть более точным и ясным в вопросах совместимости версий. Спасибо за выделение этого.
Возглавляя
35

еще более простое решение:

df = df.reindex(columns = header_list)                

где "header_list" - это список заголовков, которые вы хотите отобразить.

любой заголовок, включенный в список, который еще не найден в кадре данных, будет добавлен с пустыми ячейками ниже.

так что если

header_list = ['a','b','c', 'd']

тогда c и d будут добавлены как столбцы с пустыми ячейками

лиана
источник
2
Точнее, столбцы будут добавлены с NaN.
broccoli2000
19

Начиная с v0.16.0, DF.assign()можно использовать для назначения новых столбцов ( один / несколько ) для DF. Эти столбцы вставляются в алфавитном порядке в конце DF.

Это становится выгодным по сравнению с простым присваиванием в случаях, когда вы хотите выполнить ряд связанных операций непосредственно на возвращенном кадре данных.

Рассмотрим тот же DFпример, который продемонстрировал @DSM:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Обратите внимание, что это возвращает копию со всеми предыдущими столбцами вместе с вновь созданными. Для того, чтобы оригинал DFбыл изменен соответствующим образом, используйте его следующим образом: df = df.assign(...)поскольку он не поддерживает inplaceоперации в настоящее время.

Никил мавели
источник
Что это за тип данных для C? Я пытаюсь добавить, просматривая список строк. Но это не использует его.
eleijonmarck
12

Мне нравиться:

df['new'] = pd.Series(dtype='your_required_dtype')

Если у вас есть пустой фрейм данных, это решение гарантирует, что не NaNбудет добавлена новая строка, содержащая только .

Если dtypeне указано, более новые версии Pandas производят DeprecationWarning.

Карстен
источник
5

если вы хотите добавить имя столбца из списка

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan
Радость Мазумдер
источник
4

@ emunsing - х ответ действительно охладиться для добавления нескольких столбцов, но я не мог заставить его работать на меня в Python 2.7. Вместо этого я нашел это работает:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])
Край случая
источник
1

Приведенный ниже код отвечает на вопрос «Как мне добавить n пустых столбцов в мой существующий фрейм данных». В интересах сохранения решений подобных проблем в одном месте, я добавляю их сюда.

Подход 1 (создать 64 дополнительных столбца с именами столбцов от 1 до 64)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Подход 2 (создать 64 дополнительных столбца с именами столбцов от 1 до 64)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')
moys
источник
1

Ты можешь сделать

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 
Bharath_Raja
источник
1

Можно использовать df.insert(index_to_insert_at, column_header, init_value)для вставки нового столбца по определенному индексу.

cost_tbl.insert(1, "col_name", "") 

Вышеприведенный оператор вставит пустой столбец после первого столбца.

Усман Ахмад
источник