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

1173

У меня есть следующий индексированный 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в приведенный выше пример?

1
  • если ваш новый столбец зависит от существующего столбца, вы можете добавить новые столбцы, как показано ниже. Ersin Gülbahar 12 августа в 5:49
1213

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

Как указано в комментариях и @Alexander, в настоящее время лучшим методом для добавления значений Series в качестве нового столбца DataFrame может быть использование assign:

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

Edit 2015
Некоторые сообщили, что получили с SettingWithCopyWarningпомощью этого кода.
Однако код по-прежнему отлично работает с текущей версией pandas 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

>>> pd.version.short_version
'0.16.1'

Целью SettingWithCopyWarningявляется информирование о возможно недопустимом назначении копии Dataframe. Он не обязательно говорит о том, что вы сделали что-то неправильно (может вызвать ложные срабатывания), но начиная с версии 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.


Оригинальный ответ:

Используйте исходные индексы df1 для создания серии:

df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
27
  • 29
    если вам нужно добавить столбец, используйте DataFrame.insert: df1.insert (0, 'A', Series (np.random.randn (sLength), index = df1.index))lowtech 9 дек.
  • 33
    Начиная с версии 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 insteadZhubarb 19 янв.
  • 6
    После .loc в качестве предупреждения SettingWithCopy каким-то образом появляется еще одно предупреждение: ... self.obj [item_labels [indexer [info_axis]]] = valueseongjoo 3 фев 2016 в 7:30
  • 12
    @toto_tico Вы можете распаковать kwargsсловарь, например:df1 = df1.assign(**{'e': p.Series(np.random.randn(sLength)).values})T.C. Proctor 14 сен '17 в 16:56
  • 26 год
    Вместо того, чтобы говорить «в настоящее время» или ссылаться на годы, укажите номера версий pandas, например, «от 0,14 до 0,16 до X, в 0,17+ до Y ...»smci 04 марта '18 в 23: 582018-03-04 23:58
281

Это простой способ добавить новый столбец: df['e'] = e

6
  • 183
    Несмотря на большое количество голосов: это неверный ответ . Обратите внимание, что OP имеет фрейм данных с прерывистыми индексами, а e( Series(np.random.randn(sLength))) генерирует индексированный Series 0-n. Если вы назначите это df1, вы получите несколько ячеек NaN. joaquin 26 авг.
  • 40
    То, что говорит @joaquin, верно, но если вы помните об этом, это очень полезный ярлык. VedTopkar 27 сен.
  • 2
    @ Эрик Лещински: Не уверен, что то, как вы редактируете, поможет в этом вопросе. my_dataframe = pd.DataFrame(columns=('foo', 'bar')). Отмена редактированияKathirmani Sukumar 10 дек.
  • 1
    Это не помогает, потому что, если у вас есть несколько строк и вы используете назначение, оно присваивает всем строкам нового столбца это значение (в вашем случае e), что обычно нежелательно. Paniz 27 апр '19 в 22:42
  • 2
    Проблема , поднятая @joaquin выше , может быть просто решена (например , в ответ Хоакина выше), выполнив: df['e'] = e.valuesили , что эквивалентно, df['e'] = e.to_numpy(). Верно? flow2k 1 сен '20 в 20:36
189

I would like to add a new column, 'e', to the existing data frame and do not change anything in the data frame. (The series always got the same length as a dataframe.)

Я предполагаю, что значения индекса 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

Описание этой новой функции, когда она была впервые введена, можно найти здесь .

8
  • 4
    Какие-либо комментарии относительно относительной производительности двух методов, учитывая, что первый метод ( df['e'] = e.values) не создает копию фрейма данных, а второй вариант (использование df.assign) делает? В случаях, когда последовательно добавляется много новых столбцов и большие фреймы данных, я бы ожидал гораздо более высокой производительности первого метода. jhin 11 мая '17 в 13:05
  • 3
    @jhin Да, прямое назначение, очевидно, много, если вы работаете с фиксированным фреймворком. Преимущество использования assignзаключается в объединении ваших операций. Alexander 11 мая '17 в 19:06
  • Это определенно кажется хорошим балансом между явным и неявным. +1: DAbe Hoffman 19 мая '17 в 4:03
  • 2
    Для приколаdf.assign(**df.mean().add_prefix('mean_'))piRSquared 7 ноя '17 в 17:36
  • 2
    @Owlright Из вопроса кажется, что OP просто объединяет фреймы данных и игнорирует индекс. В этом случае будут работать описанные выше методы. Если кто-то хочет сохранить индекс, используйте что-то вроде df_new = pd.concat([df1, df2], axis=1), отметив это ignore_index=Falseпо умолчанию. Alexander 7 ноя '18 в 23:16
66

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

Фреймворк 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по умолчанию a имеет индекс, пронумерованный от 0 до n. И [] =метод pandas пытается быть "умным"

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

Когда вы используете [] =метод, pandas незаметно выполняет внешнее соединение или внешнее слияние, используя индекс левого фрейма данных и индекс правого ряда.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». Но кто знает, как эта функция изменится в будущем для поддержки новых аргументов. Возможно, ваше имя столбца будет аргументом в новом обновлении pandas, что вызовет проблемы с обновлением.

1
  • 7
    « Когда вы используете [] =метод, pandas незаметно выполняет внешнее соединение или внешнее слияние ». Это самая важная информация во всей теме. Но не могли бы вы дать ссылку на официальную документацию о том, как []=работает оператор? Lightman 01 авг.
57

Кажется, что в последних версиях Pandas можно использовать df.assign :

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

Это не производит SettingWithCopyWarning.

1
  • 3
    Копирование комментария @smci сверху ... Вместо того, чтобы говорить "в настоящее время" или ссылаться на годы, укажите номера версий PandasKyle C 16 янв.
56

Выполнение этого напрямую через NumPy будет наиболее эффективным:

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

Обратите внимание, что мое первоначальное (очень старое) предложение заключалось в использовании map(что намного медленнее):

df1['e'] = df1['a'].map(lambda x: np.random.random())
2
  • 1
    спасибо за ваш ответ, как я уже дал, могу ли я изменить ваш код, .mapчтобы использовать существующие серии вместо lambda? Я стараюсь df1['e'] = df1['a'].map(lambda x: e)или , df1['e'] = df1['a'].map(e)но это не то , что мне нужно. (Я новичок в pyhon, и ваш предыдущий ответ мне уже помог)tomasz74 23 сен '12 в 20:03
  • @ tomasz74 , если у вас уже есть eкак серии , то вам не нужно использовать map, использовать df['e']=e(@joaquins ответ). Andy Hayden 23 сен '12 в 20:33
38

Самые простые способы: -

data['new_col'] = list_of_values

data.loc[ : , 'new_col'] = list_of_values

Таким образом вы избегаете так называемой цепной индексации при установке новых значений в объекте pandas. Щелкните здесь, чтобы читать дальше .

25

Я получил ужас 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, лучшим решением является assign. См. Документацию http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign Хорошо работает для типа потока данных, в котором промежуточные значения не перезаписываются.

0
25

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

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

2
  • 2
    это вызывает настройку с предупреждением о копировании00__00__00 2 мая '18 в 14:27
  • 2
    df ['E'] = '' также работает, если кто-то хочет добавить пустой столбецdebaonline4u 4 сен '18 в 9:29
16
  1. Сначала создайте питон с list_of_eсоответствующими данными.
  2. Использовать этот: df['e'] = list_of_e
1
  • 1
    Я действительно не понимаю, почему это не лучший ответ. Если у вас есть pd.Series, эта tolist()команда может оказаться полезной. So S 23 мая '19 в 16:01
14

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

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

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

13

Если фрейм данных и объект 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)
13

Чтобы создать пустой столбец

df['i'] = None
0
12

Защита от дурака:

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

Однако следует отметить, что если вы это сделаете

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

чтобы вставить новый столбец в заданное место (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

8

Позвольте мне просто добавить, что, как и в случае с hum3 , .locэто не решило, SettingWithCopyWarningи мне пришлось прибегнуть df.insert(). В моем случае ложное срабатывание было сгенерировано "фальшивой" цепной индексацией dict['a']['e'], где 'e'новый столбец, а dict['a']DataFrame, полученный из словаря.

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

7

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

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

Чтобы добавить новый столбец e в существующий фрейм данных

 df1.loc[:,'e'] = Series(np.random.randn(sLength))
2
  • Это также дает предупреждениеB Furtado 29 авг.
  • вы должны использовать df1.loc [::, 'e'] = Series (np.random.randn (sLength))Hermes Morales 27 апр.
6

Я искал общий способ добавить столбец numpy.nans в фрейм данных, не теряя дар речи SettingWithCopyWarning.

Из следующего:

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

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

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

Для полноты картины - еще одно решение с использованием метода 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

Вот что я сделал ... Но я новичок в pandas и в 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
1
  • 10
    это плохая идея. Если фрейм данных достаточно велик, он будет интенсивно использовать память ... Кроме того, это превратится в кошмар, если вы будете время от времени добавлять столбцы. Kevad 21 апр '16 в 12:56
3
x=pd.DataFrame([1,2,3,4,5])

y=pd.DataFrame([5,4,3,2,1])

z=pd.concat([x,y],axis=1)

введите описание изображения здесь

1
  • Я сомневаюсь, что это помогает - или вообще работает. Не хочешь объяснить? Yunnosch 4 окт.
3

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

df.loc[:, 'e'] = pd.Series()
3

Если мы хотим присвоить значение масштабирования, например: 10, для всех строк нового столбца в df:

df = df.assign(new_col=lambda x:10)  # x is each row passed in to the lambda func

У df теперь будет новый столбец new_col со значением = 10 во всех строках.

2

это особый случай добавления нового столбца в фреймворк pandas. Здесь я добавляю новую функцию / столбец на основе данных существующего столбца фрейма данных.

Итак, пусть в нашем фрейме данных есть столбцы «feature_1», «feature_2», «possible_score», и мы должны добавить новый_column «predicted_class» на основе данных в столбце «possible_score».

Я буду использовать функцию map () из Python, а также определю свою собственную функцию, которая будет реализовывать логику того, как присвоить конкретный class_label каждой строке в моем фрейме данных.

data = pd.read_csv('data.csv')

def myFunction(x):
   //implement your logic here

   if so and so:
        return a
   return b

variable_1 = data['probability_score']
predicted_class = variable_1.map(myFunction)

data['predicted_class'] = predicted_class

// check dataFrame, new column is included based on an existing column data for each row
data.head()
0

Каждый раз, когда вы добавляете объект Series в качестве нового столбца в существующий DF, вам необходимо убедиться, что они оба имеют один и тот же индекс. Затем добавьте его в DF

e_series = pd.Series([-0.335485, -1.166658,-0.385571])
print(e_series)
e_series.index = d_f.index
d_f['e'] = e_series
d_f

введите описание изображения здесь

0

вы можете вставить новый столбец с помощью цикла for следующим образом:

for label,row in your_dframe.iterrows():
      your_dframe.loc[label,"new_column_length"]=len(row["any_of_column_in_your_dframe"])

пример кода здесь:

import pandas as pd

data = {
  "any_of_column_in_your_dframe" : ["ersingulbahar","yagiz","TS"],
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

#load data into a DataFrame object:
your_dframe = pd.DataFrame(data)


for label,row in your_dframe.iterrows():
      your_dframe.loc[label,"new_column_length"]=len(row["any_of_column_in_your_dframe"])
      
      
print(your_dframe) 

и вывод здесь:

any_of_column_in_your_dframe калории продолжительность new_column_length
Эрсингульбахар 420 50 13,0
Ягиз 380 40 5.0
TS 390 45 2.0

Не: вы также можете использовать это:

your_dframe["new_column_length"]=your_dframe["any_of_column_in_your_dframe"].apply(len)