Добавление нового столбца в существующий DataFrame в пандах Python


981

У меня есть следующий индексированный 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'в существующий фрейм данных и не хочу ничего менять в фрейме данных (т. Е. Новый столбец всегда имеет ту же длину, что и фрейм данных).

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является информирование о возможном неверном назначении на копии кадра данных. Это не обязательно говорит о том, что вы сделали это неправильно (это может привести к ложным срабатываниям), но из 0.13.0 это дает вам понять, что для этой цели есть более адекватные методы. Затем, если вы получите предупреждение, просто следуйте его совету: попробуйте вместо этого использовать .loc [row_index, col_indexer] = value

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


Редактировать 2017

Как указано в комментариях @Alexander, в настоящее время наилучшим методом добавления значений Series в качестве нового столбца 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), index = 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 [indexer [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


154
Несмотря на большое количество голосов: этот ответ неверный . Обратите внимание, что у OP есть фрейм данных с непостоянными индексами, и e( Series(np.random.randn(sLength))) генерирует индексированную серию 0-n. Если вы назначите это для df1, то вы получите несколько ячеек NaN.
Хоакин

32
То, что говорит @joaquin, верно, но если вы помните об этом, это очень полезный способ.
ВедТопкар

2
@Eric Leschinski: Не уверен, что редактирование поможет в этом вопросе. my_dataframe = pd.DataFrame(columns=('foo', 'bar')),
Отмена

1
Это не помогает, потому что, если у вас есть несколько строк, и вы используете присвоение, он назначает все строки нового столбца с этим значением (в вашем случае e), что обычно нежелательно.
Paniz

156

Я хотел бы добавить новый столбец 'e' в существующий фрейм данных и ничего не менять в фрейме данных. (Ряд всегда имеет ту же длину, что и кадр данных.)

Я предполагаю, что значения индекса eсовпадают со значениями в df1.

Самый простой способ инициировать новый столбец с именем eи присвоить ему значения из вашей серии e:

df['e'] = e.values

назначить (Панды 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 Из вопроса видно, что OP просто объединяет кадры данных и игнорирует индекс. В этом случае вышеуказанные методы будут работать. Если вы хотите сохранить индекс, используйте что-то вроде этого 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

Супер простое назначение столбцов

Фрейм данных Pandas реализован в виде упорядоченного набора столбцов.

Это означает, что __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. И [] =метод панд пытается быть "умным"

Что на самом деле происходит.

Когда вы используете [] =метод, pandas спокойно выполняет внешнее соединение или внешнее объединение, используя индекс левого кадра данных и индекс правого ряда.df['column'] = series

Примечание

Это быстро вызывает когнитивный диссонанс, так как []=метод пытается сделать много разных вещей в зависимости от входных данных, и результат не может быть предсказан, если вы просто не знаете, как работает панда. Поэтому я бы посоветовал не использовать []=базы кода, но при изучении данных в блокноте это нормально.

Обойти проблему

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

Вы можете понизить pd.Seriesдо np.ndarrayили 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
« Когда вы используете [] =метод, pandas спокойно выполняет внешнее соединение или внешнее объединение ». Это самая важная информация во всей теме. Но не могли бы вы предоставить ссылку на официальную документацию о том, как []=работает оператор?
Лайтман


23

Если вы хотите установить для всего нового столбца начальное базовое значение (например None), вы можете сделать это:df1['e'] = None

Это на самом деле назначило бы тип «объект» для ячейки. Таким образом, позже вы можете размещать сложные типы данных, например списки, в отдельных ячейках.


1
это поднимает настройку с копирайнингом
00__00__00

1
df ['E'] = '' также работает, если кто-то хочет добавить пустой столбец
debaonline4u

22

Я получил ужас 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 году!
Hydradon

14
  1. Сначала создайте питона с list_of_eсоответствующими данными.
  2. Использовать этот: df['e'] = list_of_e

1
Я действительно не понимаю, почему это не предпочтительный ответ. Если у вас есть pd.Series, эта tolist()команда может быть полезна.
Так С

11

Если столбец, который вы пытаетесь добавить, является переменной серии, просто:

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

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


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
Не надежно. Это не решает вопрос OP, который является случаем, когда индексы существующего информационного кадра и нового ряда не выровнены.
Александр

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)

ценность может быть Series, целым числом (в этом случае все ячейки заполняются этим одним значением) или структурой, подобной массиву

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массива NaNs в строке

Я придумал это:

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'] = Series (np.random.randn (sLength))
Hermes Morales

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


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.