Додайте стовпчик до фрейму даних з постійним значенням


187

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

Існуючі df:

Date, Open, High, Low, Close
01-01-2015, 565, 600, 400, 450

Новий df:

Name, Date, Open, High, Low, Close
abc, 01-01-2015, 565, 600, 400, 450

Я знаю, як додати існуючий стовпець / колонку даних. Але це інша ситуація, тому що все, що мені потрібно, - це додати стовпець 'Ім'я' та встановити для кожного рядка одне і те ж значення, в даному випадку 'abc'.

Відповіді:


295

df['Name']='abc' додасть новий стовпець і встановить для цього значення всі рядки:

In [79]:

df
Out[79]:
         Date, Open, High,  Low,  Close
0  01-01-2015,  565,  600,  400,    450
In [80]:

df['Name'] = 'abc'
df
Out[80]:
         Date, Open, High,  Low,  Close Name
0  01-01-2015,  565,  600,  400,    450  abc

35
Чи є якийсь інший спосіб зробити це? Я отримую наступне попередження. Значення намагається встановити на копії фрагмента з DataFrame. Спробуйте використовувати .loc [row_indexer, col_indexer] = значення замість цього. Дивіться застереження в документації: pandas.pydata.org/pandas-docs/stable/…
vishnu viswanath

3
Це означає, що ви призначаєте щось, що є копією, а не оригінальним df, я не можу далі коментувати, не бачачи дані та код у вигляді запитання. Відповідати на запитання в коментарях є контрпродуктивним. Цей код працює, ви зробили щось до цього, щоб підняти попередження
EdChum

@vishnuviswanath я отримую точно таке ж попередження, як і ви, коли використовую ноутбук Jupyter. Це трапляється зі мною, коли у мене нетривіальні розміри DataFrame (> 200 записів) та певні комбінації призначення та просто роздруковуються df.
Білл

4
@vishnuviswanath ви, ймовірно, створили фрагмент вихідного фрейму даних перед цим, а потім намагаєтесь встановити новий стовпець на цьому фрагменті. Додайте новий стовпець до вихідного фрейму даних, а потім створіть фрагмент після цього. Можливо, коли ви створюєте фрагмент фрейму даних, панди не створюють копію і якось керують нею з оригінального фрейму даних. Цей вид плутанини з цією оптимізацією, а отже, і попередженням.
amit_saxena

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

61

Ви можете insertвказати, де ви хочете знаходити новий стовпець. У цьому випадку я використовую 0нову колонку зліва.

df.insert(0, 'Name', 'abc')

  Name        Date  Open  High  Low  Close
0  abc  01-01-2015   565   600  400    450

Це не працює для мене. Моя первісна матриця 1460 x 41 , і я намагаюся додати стовпець 1 - х до фронту: df.insert(0,'coef_fix',1). Я використовую JupyterLab з Python 3.0
ColinMac

2
Добре працює для мене. Ви, можливо, не зрозуміли, що insertдіє inplace. Це означає, що значення нового кадру даних не повертається, але вихідний кадр даних було змінено. Спробуйте цеdf = pd.DataFrame(0, range(1460), range(41)); df.insert(0, 'coef_fix', 1); df
piRSquared

44

Одномісний лайнер працює

df['Name'] = 'abc'

Створює Nameстовпець і встановлює всі рядки в abcзначення


41

Підбиття підсумків того, що запропонували інші, та додавання третього способу

Ти можеш:

  • призначити (** kwargs) :

    df.assign(Name='abc')
  • отримати доступ до нової серії стовпців (вона буде створена) та встановіть її:

    df['Name'] = 'abc'
  • вставка (loc, стовпець, значення, enable_duplicates = Неправильно)

    df.insert(0, 'Name', 'abc')

    де аргумент loc (0 <= loc <= len (колонки)) дозволяє вставити стовпчик, куди потрібно.

    "loc" дає вам індекс, у якому буде розміщуватися ваш стовпець після вставки. Наприклад, вищевказаний код вставляє ім'я стовпця як 0-й стовпчик, тобто він буде вставлений перед першим стовпцем, ставши новим першим стовпцем. (Індексація починається від 0).

Усі ці методи дозволяють також додати новий стовпець із серії (просто замініть аргумент 'abc' за замовчуванням вище рядом).

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