Як додати порожній стовпець до фрейму даних?


260

Який найпростіший спосіб додати порожній стовпець до DataFrameоб’єкта pandas ? Найкраще, що я натрапив на щось таке

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

Чи є менш збочений метод?


2
Ви насправді хочете колонку, що містить порожні рядки, а точніше N/A?
фільм

Відповіді:


419

Якщо я правильно розумію, завдання потрібно заповнити:

>>> 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

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

Ви також завжди можете об'єднати новий (порожній) кадр даних у існуючий кадр даних, але це не здається мені пітонічним :)


3
Приклад для version >= 0.20.0видалення DataFrame та додавання нових стовпців у вигляді рядків. Приклад version < 0.20.0відмінної роботи у версії Pandas0.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
Точніше, стовпці будуть додані з NaNs.
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 виробляють a DeprecationWarning.



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,'')

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 

1

Можна df.insert(index_to_insert_at, column_header, init_value)вставити новий стовпець у певний індекс.

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

Вищенаведене твердження буде вставляти порожній стовпець після першого стовпця.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.