Додавання нового стовпця до існуючих DataFrame в пандах Python


978

У мене є наступний індексований DataFrame з іменованими стовпцями та рядками не- безперервними числами:

          a         b         c         d
2  0.671399  0.101208 -0.181532  0.241273
3  0.446172 -0.243316  0.051767  1.577318
5  0.614758  0.075793 -0.451460 -0.012493

Я хотів би додати новий стовпець, 'e'до існуючого кадру даних, і не хочу нічого змінювати у кадрі даних (тобто новий стовпець завжди має ту саму довжину, що і DataFrame).

0   -0.335485
1   -1.166658
2   -0.385571
dtype: float64

Як я можу додати стовпчик eдо наведеного вище прикладу?

Відповіді:


1043

Використовуйте оригінальні індекси df1 для створення серії:

df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)

Редагувати 2015
Деякі повідомили, що отримують SettingWithCopyWarningцей код.
Однак код все ще ідеально працює з поточною версією панд 0.16.1.

>>> sLength = len(df1['a'])
>>> df1
          a         b         c         d
6 -0.269221 -0.026476  0.997517  1.294385
8  0.917438  0.847941  0.034235 -0.448948

>>> df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e
6 -0.269221 -0.026476  0.997517  1.294385  1.757167
8  0.917438  0.847941  0.034235 -0.448948  2.228131

>>> p.version.short_version
'0.16.1'

Він SettingWithCopyWarningспрямований на інформування про можливе недійсне призначення на копії Dataframe. Це не обов'язково говорить, що ви зробили це неправильно (це може викликати помилкові позитиви), але з 0,13,0 він повідомляє вам, що є більш адекватні методи з тією ж метою. Потім, якщо ви отримаєте попередження, просто дотримуйтесь його рекомендацій: Спробуйте використовувати .loc [row_index, col_indexer] = значення замість цього

>>> df1.loc[:,'f'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e         f
6 -0.269221 -0.026476  0.997517  1.294385  1.757167 -0.050927
8  0.917438  0.847941  0.034235 -0.448948  2.228131  0.006109
>>> 

Насправді це в даний час більш ефективний метод, як описано в документах Pandas


Редагувати 2017 рік

Як зазначено в коментарях і від @Alexander, на даний момент найкращим методом додавання значень серії як нового стовпця DataFrame може бути використання assign:

df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)

24
якщо вам потрібно перед ім'ям використання колонки DataFrame.insert: df1.insert (0, 'A', Series (np.random.randn (sLength), індекс = df1.index))
lowtech

29
З версії Pandas 0,12 і далі, я вважаю, що цей синтаксис не є оптимальним, і попереджає:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
Жубарб

6
Після .loc як попередження SettingWithCopy якось призводить до більш попередження: ... self.obj [item_labels [індекс [info_axis]]] = значення
seongjoo

12
@toto_tico Ви можете розпакувати kwargsсловник так:df1 = df1.assign(**{'e': p.Series(np.random.randn(sLength)).values})
TC Proctor

23
Замість того, щоб говорити "в даний час" або посилатися на роки, будь ласка, посилайтесь на номери версій панди, наприклад, "між 0,14-0,16 до X, в 0,17+ до Y ..."
smci

229

Це простий спосіб додавання нового стовпця: df['e'] = e


153
Незважаючи на велику кількість голосів: ця відповідь неправильна . Зауважте, що ОП має кадр даних з неперервними індексами та e( Series(np.random.randn(sLength))) генерує індексовану серію 0-n. Якщо ви призначите це df1, то ви отримаєте кілька комірок NaN.
Жоакін

32
Те, що говорить @joaquin, є правдивим, але якщо ви пам’ятаєте про це, це дуже корисний ярлик.
VedTopkar

2
@Eric Leschinski: Не знаю, як редагувати допоможе у цьому питанні. my_dataframe = pd.DataFrame(columns=('foo', 'bar')). Повернення вашої
редакції

1
Це не допомагає, тому що якщо у вас є кілька рядків, і ви використовуєте призначення, він призначає всі рядки нового стовпця з тим значенням (у вашому випадку e), яке зазвичай небажано.
Паніз

156

Я хотів би додати новий стовпець "e" до існуючого кадру даних і нічого не змінювати у кадрі даних. (Серія завжди мала ту саму довжину, що і кадр даних.)

Я припускаю, що значення індексу eзбігаються з значеннями в df1.

Найпростіший спосіб ініціювати новий стовпчик з назвою eта призначити йому значення з вашої серії e:

df['e'] = e.values

призначити (Pandas 0.16.0+)

Станом на Pandas 0.16.0 ви також можете використовувати assign, який призначає нові стовпці DataFrame та повертає новий об'єкт (копію) з усіма оригінальними стовпцями на додаток до нових.

df1 = df1.assign(e=e.values)

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

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df.assign(mean_a=df.a.mean(), mean_b=df.b.mean())
   a  b  mean_a  mean_b
0  1  3     1.5     3.5
1  2  4     1.5     3.5

У контексті вашого прикладу:

np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
mask = df1.applymap(lambda x: x <-0.7)
df1 = df1[-mask.any(axis=1)]
sLength = len(df1['a'])
e = pd.Series(np.random.randn(sLength))

>>> df1
          a         b         c         d
0  1.764052  0.400157  0.978738  2.240893
2 -0.103219  0.410599  0.144044  1.454274
3  0.761038  0.121675  0.443863  0.333674
7  1.532779  1.469359  0.154947  0.378163
9  1.230291  1.202380 -0.387327 -0.302303

>>> e
0   -1.048553
1   -1.420018
2   -1.706270
3    1.950775
4   -0.509652
dtype: float64

df1 = df1.assign(e=e.values)

>>> df1
          a         b         c         d         e
0  1.764052  0.400157  0.978738  2.240893 -1.048553
2 -0.103219  0.410599  0.144044  1.454274 -1.420018
3  0.761038  0.121675  0.443863  0.333674 -1.706270
7  1.532779  1.469359  0.154947  0.378163  1.950775
9  1.230291  1.202380 -0.387327 -0.302303 -0.509652

Опис цієї нової функції, коли вона була вперше представлена, можна знайти тут .


2
Будь-який коментар щодо відносної продуктивності двох методів, враховуючи, що перший метод ( df['e'] = e.values) не створює копію фрейму даних, а другий варіант (за допомогою df.assign) робить? У випадках, коли послідовно додаються багато нових стовпців та великі фрейми даних, я очікую набагато кращої ефективності першого методу.
Джин

2
@jhin Так, пряме призначення, очевидно, значно, якщо ви працюєте на фіксованому кадрі даних. Користь від використання assignполягає в тому, коли з'єднуєте свої операції.
Олександр

Це, звичайно, здається приємним балансом між явним та неявним. +1: D
Ейб Гофман

2
Для розвагиdf.assign(**df.mean().add_prefix('mean_'))
piRSquared

1
@Owlright З питання виходить, що ОП просто об'єднує рамки даних і ігнорує індекс. Якщо це так, то описані вище методи працюватимуть. Якщо ви хочете зберегти індекс, то використовуйте щось подібне df_new = pd.concat([df1, df2], axis=1), зазначаючи це ignore_index=Falseза замовчуванням.
Олександр

51

Схоже, що в останніх версіях Pandas шлях слід використовувати df.assign :

df1 = df1.assign(e=np.random.randn(sLength))

Це не дає SettingWithCopyWarning.


1
Копіювання коментаря @smci зверху ... Замість того, щоб говорити "наразі" чи посилатися на роки, зверніться до номерів версій Pandas
Kyle C

50

Це зробити безпосередньо через NumPy буде найбільш ефективним:

df1['e'] = np.random.randn(sLength)

Зауважте, моя оригінальна (дуже стара) пропозиція полягала у використанні map(що набагато повільніше):

df1['e'] = df1['a'].map(lambda x: np.random.random())

1
дякую за вашу відповідь, як я вже дав, чи можу я змінити ваш код, .mapщоб використовувати існуючі серії замість lambda? Я намагаюся df1['e'] = df1['a'].map(lambda x: e)або , df1['e'] = df1['a'].map(e)але це не те , що мені потрібно. (Я новачок у pyhon, і ваша попередня відповідь мені вже допомогла)
tomasz74

@ tomasz74, якщо у вас вже є eсерія, то вам не потрібно використовувати map, використовуйте df['e']=e(@joaquins відповідь).
Енді Хайден

49

Супер просте призначення стовпців

Кадр даних панди реалізований як упорядкований диктант стовпців.

Це означає, що __getitem__ []не тільки можна використовувати для отримання певного стовпця, але й __setitem__ [] =можна використовувати для призначення нового стовпця.

Наприклад, до цього фрейму даних може бути доданий стовпець, просто використовуючи []аксесуар

    size      name color
0    big      rose   red
1  small    violet  blue
2  small     tulip   red
3  small  harebell  blue

df['protected'] = ['no', 'no', 'no', 'yes']

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

Зауважте, що це працює, навіть якщо індекс фрейму даних вимкнено.

df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

[] = це шлях, але слідкуйте!

Однак якщо у вас є pd.Seriesі спробуєте призначити його в кадр даних, де індекси вимкнено, ви зіткнетеся з проблемою. Див. Приклад:

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

Це тому, що pd.Seriesза замовчуванням індекс перераховується від 0 до n. І [] =метод панди намагається бути "розумним"

Що насправді відбувається.

При використанні [] =методу панди тихо виконують зовнішнє з'єднання або зовнішнє злиття, використовуючи індекс лівої рамки даних та індекс рядка правої руки.df['column'] = series

Бічна примітка

Це швидко викликає когнітивний дисонанс, оскільки []=метод намагається зробити багато різних речей залежно від вкладених даних, і результат неможливо передбачити, якщо ви просто не знаєте, як працює панда. Тому я б порадив проти []=кодових баз, але при дослідженні даних у зошиті це добре.

Обхід проблеми

Якщо у вас є pd.Seriesі хочете, щоб він був призначений зверху вниз, або якщо ви кодуєте продуктивний код і не впевнені в порядку індексу, варто його захистити для такого виду.

Ви можете pd.Seriesскористатись «a» np.ndarrayчи «a» list, це зробить трюк.

df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values

або

df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))

Але це не дуже явно.

Можливо, прийде якийсь кодер і каже "Ей, це виглядає зайвим, я просто оптимізую це".

Явний спосіб

Встановлення індексу до того, pd.Seriesщоб бути індексом, dfє явним.

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)

Або, що більш реально, у вас, мабуть, pd.Seriesвже є.

protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index

3     no
2     no
1     no
0    yes

Тепер можна призначити

df['protected'] = protected_series

    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

Альтернативний спосіб з df.reset_index()

Оскільки індексний дисонанс є проблемою, якщо ви відчуваєте, що індекс фрейму даних не повинен диктувати речі, ви можете просто скинути індекс, це повинно бути швидше, але це не дуже чисто, оскільки ваша функція зараз, ймовірно, виконує дві речі.

df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

Примітка df.assign

Хоча виразніше df.assignзробіть те, що ви робите, це насправді має всі ті ж проблеми, що і вище[]=

df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

Просто слідкуйте, df.assignщоб ваш стовпець не називався self. Це призведе до помилок. Це стає df.assign смердючим , оскільки є такі види артефактів у функції.

df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'

Ви можете сказати: "Ну, я просто selfтоді не буду користуватися ". Але хто знає, як ця функція змінюється в майбутньому для підтримки нових аргументів. Можливо, назва вашого стовпця буде аргументом у новому оновленні панд, що спричинить проблеми з оновленням.


6
" При використанні [] =методу панди тихо виконують зовнішнє з'єднання або зовнішнє злиття ". Це найважливіша інформація у всій темі. Але ви могли б надати посилання на офіційну документацію про те, як []=працює оператор?
Lightman


23

Якщо ви хочете встановити цілий новий стовпець на початкове базове значення (наприклад None), ви можете зробити це:df1['e'] = None

Це насправді призначить тип "об'єкта" клітині. Тож пізніше ви можете розміщувати складні типи даних, як-от список, в окремі комірки.


1
це піднімає налаштування за попередженням
00__00__00

1
df ['E'] = '' також працює, якщо хтось хоче додати порожній стовпець
debaonline4u

21

Я злякався SettingWithCopyWarning, і це не було виправлено за допомогою синтаксису iloc. Мій DataFrame був створений read_sql з джерела ODBC. Використовуючи пропозицію lowtech вище, для мене спрацювало наступне:

df.insert(len(df.columns), 'e', pd.Series(np.random.randn(sLength),  index=df.index))

Це добре працювало, щоб вставити стовпчик у кінці. Я не знаю, чи це найефективніше, але мені не подобаються попереджувальні повідомлення. Я думаю, що є краще рішення, але я не можу його знайти, і я думаю, що це залежить від певного аспекту індексу.
Примітка . Це працює лише один раз і подасть повідомлення про помилку при спробі перезаписати і існуючий стовпець.
Примітка. Як зазначено вище та від 0,16,0 призначення, це найкраще рішення. Дивіться документацію http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign Добре працює для типу потоку даних, де ви не перезаписуєте свої проміжні значення.


Це єдиний спосіб, який працює для мене у 2019 році!
гідрадон

14
  1. Спочатку створіть пітон, у list_of_eякому є відповідні дані.
  2. Використовуй це: df['e'] = list_of_e

1
Я справді не розумію, чому це не найкраща відповідь. Якщо у вас є pd.Series, tolist()команда може бути корисною.
Так S

11

Якщо стовпець, який ви намагаєтеся додати, є змінною серії, то просто:

df["new_columns_name"]=series_variable_name #this will do it for you

Це добре працює, навіть якщо ви замінюєте існуючий стовпець. Просто введіть ім'я new_column_name так само, як стовпець, який ви хочете замінити. Він просто замінить існуючі дані стовпців новими даними серії.


10

Якщо кадр даних та об'єкт Series мають однаковий індекс , pandas.concatтут також працює:

import pandas as pd
df
#          a            b           c           d
#0  0.671399     0.101208   -0.181532    0.241273
#1  0.446172    -0.243316    0.051767    1.577318
#2  0.614758     0.075793   -0.451460   -0.012493

e = pd.Series([-0.335485, -1.166658, -0.385571])    
e
#0   -0.335485
#1   -1.166658
#2   -0.385571
#dtype: float64

# here we need to give the series object a name which converts to the new  column name 
# in the result
df = pd.concat([df, e.rename("e")], axis=1)
df

#          a            b           c           d           e
#0  0.671399     0.101208   -0.181532    0.241273   -0.335485
#1  0.446172    -0.243316    0.051767    1.577318   -1.166658
#2  0.614758     0.075793   -0.451460   -0.012493   -0.385571

Якщо вони не мають однакового індексу:

e.index = df.index
df = pd.concat([df, e.rename("e")], axis=1)

10

Недорогий:

df.loc[:, 'NewCol'] = 'New_Val'

Приклад:

df = pd.DataFrame(data=np.random.randn(20, 4), columns=['A', 'B', 'C', 'D'])

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
3  -0.147354  0.778707  0.479145  2.284143
4  -0.529529  0.000571  0.913779  1.395894
5   2.592400  0.637253  1.441096 -0.631468
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
8   0.606985 -2.232903 -1.358107 -2.855494
9  -0.692013  0.671866  1.179466 -1.180351
10 -1.093707 -0.530600  0.182926 -1.296494
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
18  0.693458  0.144327  0.329500 -0.655045
19  0.104425  0.037412  0.450598 -0.923387


df.drop([3, 5, 8, 10, 18], inplace=True)

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
4  -0.529529  0.000571  0.913779  1.395894
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
9  -0.692013  0.671866  1.179466 -1.180351
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
19  0.104425  0.037412  0.450598 -0.923387

df.loc[:, 'NewCol'] = 0

df
           A         B         C         D  NewCol
0  -0.761269  0.477348  1.170614  0.752714       0
1   1.217250 -0.930860 -0.769324 -0.408642       0
2  -0.619679 -1.227659 -0.259135  1.700294       0
4  -0.529529  0.000571  0.913779  1.395894       0
6   0.757178  0.240012 -0.553820  1.177202       0
7  -0.986128 -1.313843  0.788589 -0.707836       0
9  -0.692013  0.671866  1.179466 -1.180351       0
11 -0.143273 -0.503199 -1.328728  0.610552       0
12 -0.923110 -1.365890 -1.366202 -1.185999       0
13 -2.026832  0.273593 -0.440426 -0.627423       0
14 -0.054503 -0.788866 -0.228088 -0.404783       0
15  0.955298 -1.430019  1.434071 -0.088215       0
16 -0.227946  0.047462  0.373573 -0.111675       0
17  1.627912  0.043611  1.743403 -0.012714       0
19  0.104425  0.037412  0.450598 -0.923387       0

2
Не дурний. Це не стосується питання ОП, що є випадком, коли індекси існуючої рамки даних та нової серії не узгоджуються.
Олександр

7

Дозвольте лише додати, що, як і для hum3 , .locне вирішив, SettingWithCopyWarningі мені довелося вдатися df.insert(). У моєму випадку хибний позитив генерується за допомогою "підробленої" ланцюгової індексації dict['a']['e'], де 'e'новий стовпець, і dict['a']це DataFrame, що надходить зі словника.

Також зауважте, що якщо ви знаєте, що ви робите, ви можете переключити попередження, pd.options.mode.chained_assignment = None використовуючи одне з інших рішень, поданих тут.


7

щоб вставити новий стовпець у заданому місці (0 <= loc <= кількість стовпців) у кадр даних, просто використовуйте Dataframe.insert:

DataFrame.insert(loc, column, value)

Тому, якщо ви хочете додати стовпчик e в кінці кадру даних, який називається df , ви можете використовувати:

e = [-0.335485, -1.166658, -0.385571]    
DataFrame.insert(loc=len(df.columns), column='e', value=e)

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

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.insert.html


6

Перш ніж призначити новий стовпець, якщо у вас індексовані дані, вам потрібно відсортувати індекс. Принаймні в моєму випадку я повинен був:

data.set_index(['index_column'], inplace=True)
"if index is unsorted, assignment of a new column will fail"        
data.sort_index(inplace = True)
data.loc['index_value1', 'column_y'] = np.random.randn(data.loc['index_value1', 'column_x'].shape[0])

6

Однак слід зауважити, що якщо це зробити

df1['e'] = Series(np.random.randn(sLength), index=df1.index)

це фактично буде лівим з’єднанням на df1.index. Отже, якщо ви хочете отримати зовнішній ефект приєднання, моє, мабуть, недосконале рішення - створити фрейм даних із значеннями індексу, що охоплює всесвіт ваших даних, а потім скористатись кодом вище. Наприклад,

data = pd.DataFrame(index=all_possible_values)
df1['e'] = Series(np.random.randn(sLength), index=df1.index)

5

Я шукав загальний спосіб додавання стовпця numpy.nans до фрейму даних, не отримуючи німого SettingWithCopyWarning.

З наступного:

  • відповіді тут
  • це питання про передачу змінної як аргументу ключового слова
  • цей метод для генерації numpyмасиву NaN в рядку

Я придумав це:

col = 'column_name'
df = df.assign(**{col:numpy.full(len(df), numpy.nan)})

4

Щоб додати новий стовпець "e" до існуючого кадру даних

 df1.loc[:,'e'] = Series(np.random.randn(sLength))

Він також дає застереження
B Furtado

ви повинні використовувати df1.loc [::, 'e'] = Серія (np.random.randn (sLength))
Гермес Моралес

4

Для повноти - ще одне рішення за допомогою методу DataFrame.eval () :

Дані:

In [44]: e
Out[44]:
0    1.225506
1   -1.033944
2   -0.498953
3   -0.373332
4    0.615030
5   -0.622436
dtype: float64

In [45]: df1
Out[45]:
          a         b         c         d
0 -0.634222 -0.103264  0.745069  0.801288
4  0.782387 -0.090279  0.757662 -0.602408
5 -0.117456  2.124496  1.057301  0.765466
7  0.767532  0.104304 -0.586850  1.051297
8 -0.103272  0.958334  1.163092  1.182315
9 -0.616254  0.296678 -0.112027  0.679112

Рішення:

In [46]: df1.eval("e = @e.values", inplace=True)

In [47]: df1
Out[47]:
          a         b         c         d         e
0 -0.634222 -0.103264  0.745069  0.801288  1.225506
4  0.782387 -0.090279  0.757662 -0.602408 -1.033944
5 -0.117456  2.124496  1.057301  0.765466 -0.498953
7  0.767532  0.104304 -0.586850  1.051297 -0.373332
8 -0.103272  0.958334  1.163092  1.182315  0.615030
9 -0.616254  0.296678 -0.112027  0.679112 -0.622436

4

Щоб створити порожній стовпець

df['i'] = None

3

Далі, що я зробив ... Але я досить новачок у пандах і справді Python взагалі, тому ніяких обіцянок.

df = pd.DataFrame([[1, 2], [3, 4], [5,6]], columns=list('AB'))

newCol = [3,5,7]
newName = 'C'

values = np.insert(df.values,df.shape[1],newCol,axis=1)
header = df.columns.values.tolist()
header.append(newName)

df = pd.DataFrame(values,columns=header)

3

Якщо ви отримаєте SettingWithCopyWarning, просто виправити - скопіювати DataFrame, до якого ви намагаєтеся додати стовпець.

df = df.copy()
df['col_name'] = values

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