Как создать новый столбец в pandas

от admin

4 способа добавления колонок в датафреймы Pandas

Pandas — это библиотека для анализа и обработки данных, написанная на языке Python. Она предоставляет множество функций и способов для управления табличными данными. Основная структура данных Pandas — это датафрейм, который хранит информацию в табличной форме с помеченными строками и столбцами.

В контексте данных строки представляют собой утверждения, или точки данных. Столбцы отражают свойства, или атрибуты утверждений. Рассмотрим эту структуру на простом примере. Допустим, каждая строка — это дом. В таком случае, столбцы заключают в себе сведения об этом доме (его возрасте, количестве комнат, стоимости и т.д.).

Добавление или удаление столбцов — обычная операция при анализе данных. Ниже мы разберем 4 различных способа добавления новых столбцов в датафрейм Pandas.

Сначала создадим простой фрейм данных для использования в примерах:

Способ 1-й

Пожалуй, это самый распространенный путь создания нового столбца в Pandas:

Мы указываем имя столбца подобно тому, как выбираем столбец во фрейме данных. Затем этому столбцу присваиваются значения. Новый столбец добавляется последним (т. е. становится столбцом с самым высоким индексом).

Можно добавить сразу несколько столбцов. Их наименования перечисляются списком, а значения должны быть двумерными для совместимости с количеством строк и столбцов. Например, следующий код добавляет три столбца, заполненные случайными целыми числами от 0 до 10:

Давайте удалим эти три столбца, прежде чем перейти к следующему методу.

Способ 2-й

В первом способе мы добавляли новый столбец в конец. Pandas также позволяет добавлять столбцы по определенному индексу. Для настройки расположения нового столба воспользуемся функцией вставки (insert function). Давайте добавим один столбец рядом с А:

Для использования функции вставки необходимо 3 параметра: индекс, имя столбца и значение. Индексы столбцов начинаются с 0, поэтому мы устанавливаем параметр индекса 1, чтобы добавить новый столбец рядом со столбцом A. Мы можем указать постоянное значение, которое будет выставлено во всех строках.

Способ 3-й

Функция loc позволяет выбирать строки и столбцы, используя их метки. Таким же образом можно создать новый столбец:

Для выбора строк и столбцов мы указываем нужные метки. Если хотим выбрать все строки, ставим двоеточие. В части таблицы, где нужно проставить столбец, указываем метки столбцов, которые нам необходимо выбрать. Поскольку в датафрейме нет столбца E, Pandas создаст новый столбец.

Способ 4-й

Добавить столбцы можно также с помощью функции assign :

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

Надо понимать, что между функциями assign и insert есть существенное различие.

Функция вставки ( insert ) работает на месте. Это означает, что изменение (добавление нового столбца) сохраняется во фрейме данных.

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

Заключение

Мы рассмотрели 4 различных способа добавления новых столбцов в фрейм данных Pandas. Это обычная операция при анализе и обработке данных.

Мне нравится пользоваться библиотекой Pandas, поскольку она предоставляет, как правило, несколько способов для выполнения одной задачи. По-моему, это говорит о гибкости и универсальности Pandas.

pandas.DataFrame.insert#

Raises a ValueError if column is already contained in the DataFrame, unless allow_duplicates is set to True.

Parameters loc int

Insertion index. Must verify 0 <= loc <= len(columns).

column str, number, or hashable object

Label of the inserted column.

value Scalar, Series, or array-like allow_duplicates bool, optional, default lib.no_default

Insert new item by index.

Notice that pandas uses index alignment in case of value from type Series :

Таблицы pandas #

pandas.DataFrame — по сути дела таблица, на которую можно смотреть как на объединение столбцов pandas.Series с выравниванием по общему индексу.

s1 s2
a 1 NaN
b 2 two
c <NA> three

Таблицы изменяемы с точки зрения содержимого их ячеек, но лишь частично изменяемы с точки зрения размера: добавлять на месте можно только столбцы, но не строки.

Создание таблицы#

Как и в случае со столбцами, есть множество способов создать таблицу pandas из уже существующих объектов python . Большинство из них опираются на конструктор pandas.DataFrame.

Список списков или двухмерный массив NumPy #

Если ваши данные хранятся в виде списка списков, то на выходе каждый вложенный список будет соответствовать строке таблице.

0 1 2
0 a11 a12 a13
1 a21 a22 a23

По умолчанию генерируется RangeIndex и для строк и для столбцов таблицы.

Опциональными параметрами конструктора columns и index можно указать пользовательские значения.

column 1 column 2 column 3
row 1 a11 a12 a13
row 2 a21 a22 a23

Если вместо списка списков передавать двухмерный массив NumPy , то все будет работать точно также, кроме возможной потери типов.

column 1 column 2 column 3
row 1 a11 a12 a13
row 2 a21 a22 a23

Словарь#

Один самых удобных способов создавать таблицу в pandas — использовать словари.

Тут возможно два варианта.

ключи словаря — названия столбца, значение по ключу — содержимое соответствующего столбца;

ключи словаря — метки строк, значение по ключу — содержимое соответствующей строки.

По столбцам#

Первый вариант гораздо более распространен, поэтому его рассмотрим первым. Итак, ключи словаря станут названиями столбцов, значение по ключу — станет содержимым с соответствующим значением.

Будущие столбцы в словари могут быть представлены списком, массивом NumPy , а также столбцом pandas . При этом в случае списков и массивов NumPy накладывается требование на одинаковую длину всех столбцов, а также автоматически генерируется RangeIndex, если он не указан в явном виде опциональным параметром index .

column 1 column 2 column 3
a a11 a21 a31
b a21 a22 a32

Если же содержимое будущих столбцов представлено в виде столбцов pandas , то индекс таблицы генерируется из индексов этих столбцов, а ограничение на одинаковую длину столбцов снимается: строки таблицы выравниваются по индексу.

column 1 column 2 column 3
a 1.0 4 5
b 2.0 3 6
c NaN <NA> 7
По строкам#

Статический метод pandas.DataFrame.form_dict — более специализированный метод для создания таблицы из словаря. В примерах из предыдущего раздела этот метод сработает точно также, как и базовый конструктор класса, но наличие дополнительного опционального параметра orient ( orientation ) позволяет создавать таблицу из строк.

Если указать в качестве orient строку index , то ключи словаря будут восприниматься в качестве меток строк, а значение по ключу — содержимое строки с соответствующей меткой. Все остальное продолжает работать также, но с заменой меток и названий столбцов местами.

column 1 column 2
row1 1 2
row2 4 3

Чтение таблиц с жесткого диска#

Библиотека pandas позволяет свободно оперировать с таблицами в формате csv , json , таблицами excel (потребуется установка дополнительной библиотеки, например, openpyxl), а также более продвинутыми бинарными форматами hdf5, apache parquet и многими другими форматами. Формат csv — один из самых простых и распространенных в научной среде, поэтому рассмотрим чтение таблиц средствами pandas именно на его примере.

Все таблицы из этой лекции хранятся в репозитории с исходниками этого ресурса в папке по ссылке.

Предположим следующее содержимое хранится в текстовом файле planets.csv со следующим содержимым.

Для чтения такой таблицы используется метод read_csv.

Название Количество спутников Масса Группа Кольца
0 Меркурий 0 0.0055 земная группа Нет
1 Венера 0 0.8150 земная группа Нет
2 Земля 1 1.0000 земная группа Нет
3 Марс 2 0.1070 земная группа Нет
4 Юпитер 62 317.8000 газовый гигант Да

В самом простом варианте использования функции read_csv

имена столбцов распознаются из первой строки файла (параметром header можно повлиять на это);

в качестве индекса генерируется RangeIndex (параметром index_col можно выбрать столбец индекса таблицы);

в качестве разделителя ожидается символ запятой “ , ” (параметром sep можно на это повлиять);

пропущенные значения заполняются значением “ np.nan ” (параметром na_values можно указать, какие ещё значения интерпретировать, как пропущенные);

столбцы с датами не распознаются (смотри страницу “ Дата и время ”).

Метод DataFrame.head возвращает первые n строк таблицы. По умолчанию n равно 5, но можно указать явно и другое значение. Похожий по смыслу метод DataFrame.tail возвращает последние n строк.

Метод DataFrame.info печатает информацию о таблице. В частности, из вывода этой функции можно понять количество строк и столбцов, тип индекса таблицы, имя каждого столбца, тип данных и количество непропущенных значений в них.

Считаем эту таблицу ещё раз, указав в этот раз в качестве индекса столбец "Название" .

Количество спутников Масса Группа Кольца
Название
Меркурий 0 0.0055 земная группа Нет
Венера 0 0.8150 земная группа Нет
Земля 1 1.0000 земная группа Нет
Марс 2 0.1070 земная группа Нет
Юпитер 62 317.8000 газовый гигант Да
Сатурн 34 95.2000 газовый гигант Да
Уран 27 14.3700 ледяной гигант Да
Нептун 13 17.1500 ледяной гигант Да

Аналогично можно считывать данные из таблиц excel методом read_excel.

Методами to_csv и to_excel можно сохранить DataFrame в таблицу удобном формате (для сохранения в excel необходимо поставить библиотеку openpyxl или её аналоги).

Индексация#

Строки#

Для получения строк таблицы используются те же самые .loc и iloc (метки и порядковый номер соответственно).

В ответ вы получаете объект pandas.Series соответствующей всей строке, при этом индекс этого объекта соответствует названиям столбцов. Если использовать срезы или список меток, то вы получите новую таблицу с, возможно, меньшим количеством строк.

Простые квадратные скобки “ [] ” не индексируют таблицу по строкам!

Столбцы#

Для получения столбца используется оператор “ [] ”.

Если в названии столбца нет пробелов и оно не совпадает ни с одним методом класса pandas.DataFrame , то можно использовать точечную нотацию. Хотя, конечно, в случае кириллицы это выглядит странно.

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

How to add a new column to an existing DataFrame?

I have the following indexed DataFrame with named columns and rows not- continuous numbers:

I would like to add a new column, ‘e’ , to the existing data frame and do not want to change anything in the data frame (i.e., the new column always has the same length as the DataFrame).

How can I add column e to the above example?

32 Answers 32

Edit 2017

As indicated in the comments and by @Alexander, currently the best method to add the values of a Series as a new column of a DataFrame could be using assign :

Edit 2015
Some reported getting the SettingWithCopyWarning with this code.
However, the code still runs perfectly with the current pandas version 0.16.1.

The SettingWithCopyWarning aims to inform of a possibly invalid assignment on a copy of the Dataframe. It doesn’t necessarily say you did it wrong (it can trigger false positives) but from 0.13.0 it let you know there are more adequate methods for the same purpose. Then, if you get the warning, just follow its advise: Try using .loc[row_index,col_indexer] = value instead

In fact, this is currently the more efficient method as described in pandas docs

Читать:
Как удалить ячейки определенного цвета excel

Похожие статьи