Добавить новую колонку pandas

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 ) работает на месте. Это означает, что изменение (добавление нового столбца) сохраняется во фрейме данных.

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

Рекомендуем:  Canton ergo 200 dc

Заключение

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

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

Источник

Как добавить колонку к pd.DataFrame

…и остаться в живых

Введение

В Pandas существует по меньшей мере три официальных способа добавить колонку, не включая экзотических:

Способ №1

У этого способа самый простой и очевидный синтаксис, поэтому по умолчанию обычно используют именно его. Но наверняка каждый, кто работал с Pandas, получал хотя бы раз в жизни такой неприятный warning при добавлении колонки:

Этот warning говорит нам, что существует второй способ.

Способ №2

Откуда же берется warning в первом способе? Он возникает, когда выполняется несколько выборок идущих друг за другом, причем на вход следующей выборки подаются результаты предыдущей выборки. В терминологии Pandas это называется chained indexing и выглядит например так:

Если попытаться модифицировать результаты chained indexing (добавление колонки это тоже модификация), то Pandas не поймет, что мы хотим — добавить колонку в результаты выборки, или добавить колонку в исходный фрейм? Оба примера, приведенные ниже, эквивалентны с точки зрения Pandas:

Чтобы выдать SettingWithCopyWarning , Pandas запоминает источник данных для каждого фрейма, ‘родительский’ фрейм. Если такой источник существует, т.е. фрейм является подмножеством данных родительского фрейма, то в момент модификации выдается warning.

Второй способ позволяет нам более явным образом сообщить о своих намерениях, т.к. даёт совместить выборку и присваивание в одном выражении.

Более подробно о премудростях chained indexing можно прочитать в документации Pandas или в отличной статье на Medium.

Способ №3

Третий способ не модифицирует исходный фрейм, что в зависимости от ситуации может быть как плюсом (например при повторном выполнении ячейки в Ipython Notebook), так и минусом, загромождая код присваиваниями. Кроме того, при выполнении assign() всегда происходит создание нового фрейма, что теоретически должно быть немного медленнее, чем предыдущие in-place способы.

Наличие нескольких способов сделать одну и ту же простую задачу противоречит известному принципу Zen of Python :

There should be one—and preferably only one—obvious way to do it.

И как оказалось, проблема здесь не только в нарушении философского принципа.

Проблема

Я давно замечал, что при активном добавлении колонок во фреймы код начинает работать подозрительно медленно. Под активным я имею в виду сотни и тысячи добавлений — такие задачи встречаются, когда данные надо разбить на много мелких групп и работать с каждой отдельно. Использование третьего способа, через assign() обычно ускоряло такой код, хотя теоретически он должен работать медленнее двух первых — я списывал это на то, что мне просто показалось, и никогда не делал точных замеров.

Но на последней задаче эта проблема проявилась особенно остро. Скрипт, который должен был пропустить через себя примерно 100Gb данных, и довольно бодро стартовавший с прогнозом времени выполнения 3 часа, был оставлен на ночь. К утру скрипт не выполнил и 20% работы и почти завис, потребляя при этом 100% CPU. В чём же дело?

Запуск скрипта под cProfile выявил занятную картину: основную часть времени процесс находится внутри метода gc.collect() , при том, что я нигде не вызываю сборщик мусора. Такое поведение было бы объяснимым для виртуальной машины Java, работающей в условиях нехватки памяти, тогда бы сборщик мусора активировался на каждый чих. Но Python?

Рекомендуем:  Динамика социальных изменений молодежи

Пришлось поглубже залезть в трассировку вызовов… и следы привели к коду, добавляющему колонки в dataframe! Вот фрагмент кода метода DataFrame._check_setitem_copy() , занимающегося проверкой при добавлении колонки, и выдающего тот самый SettingWithCopyWarning , о котором говорилось выше :

В поле self._is_copy хранится weak reference на объект, являющийся ‘родителем’ текущего фрейма. Чтобы проверить, жив ли еще родитель, авторы Pandas не нашли лучшего способа, чем просто запустить сборку мусора во всей виртуальной машине 😟

На тестах, когда в памяти не очень много объектов, сборка мусора отрабатывает практически мгновенно и код не вызывает никаких нареканий. В моём же случае в памяти было закешировано около 10Gb данных, и сборщику мусора приходилось изрядно потрудиться, обходя все эти объекты при каждом добавлении колонки во фрейм.

Решение

Решение было простым — раз блок кода со сборкой мусора исполняется только при наличии ‘родителя’, надо сделать так, чтобы родителя не было. Я просто добавил вызов copy() перед тем местом, где добавляется колонка. После copy() фрейм считается ‘заново рождённым’, и не содержит ссылок на источник данных:

Скрипт сразу заработал намного быстрее, и завершился всего за час 🎉

Отмечу, что тормоза были одинаковыми при использовании и первого и второго способа добавления колонки, что неудивительно, т.к. оба они вызывают эту проверку. А что же третий способ, assign() ? Посмотрим на его код, он очень простой (привожу только ветку для Python 3.6):

Как видно, этот код делает ровно то, что я сделал вручную, ускоряя свой скрипт: сначала копирует фрейм, а потом добавляет в него колонки дедовским способом. Именно поэтому использование assign() , вопреки логике, всегда ускоряло работу.

Выводы

Для пользователей Pandas вывод простой: надёжнее всего использовать assign() , и со стороны performance, и со стороны того, что он ограждает пользователя от side effects, связанных с необратимым изменением фрейма. Автор статьи, которую я рекомендовал выше, приходит к тем же выводам. Всегда, когда надо присвоить что-то фрейму, перед присваиванием лучше вызвать df.copy() , чтобы избежать неоднозначностей. И, как показывает мой пример, еще и получить прибавку к скорости!

А разработчикам Pandas хорошо бы или найти способ отказаться от такой brute-force проверки, или хотя бы отразить её наличие в документации.

Источник

Добавление и удаление столбца в DataFrame Pandas

Чтобы добавить новый столбец к существующему в DataFrame Pandas, назначьте новые значения столбца, проиндексированному с использованием нового имени столбца.

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

Синтаксис

Синтаксис для добавления столбца в DataFrame:

Где, mydataframe – это DataFrame, в который вы хотите добавить новый столбец с меткой new_column_name. Вы можете указать все значения столбца в виде списка или одно значение, которое будет использоваться по умолчанию для всех строк.

Пример 1

В этом примере мы создадим DataFrame df_marks и добавим новый столбец с именем geometry.

Столбец добавляется к DataFrame с указанным списком в качестве значений столбца.

Длина списка, который вы предоставляете для нового столбца, должна равняться количеству строк в DataFrame. Если это условие не выполняется, вы получите сообщение об ошибке, подобное приведенному ниже.

Пример 2: со значением по умолчанию

В этом примере мы создадим df_marks и добавим новый столбец с именем geometry со значением по умолчанию для каждой строки в DataFrame.

Столбец добавляется в DataFrame с указанным значением в качестве значения столбца по умолчанию.

Рекомендуем:  Если не работает один наушник беспроводной что делать deppa

Как у далить столбец?

Функция Pandas DataFrame.pop() используется для удаления столбца из DataFrame.

В этом руководстве мы рассмотрим примеры, чтобы узнать, как использовать pop() для удаления столбца из Pandas DataFrame.

Пример 1

В этом примере мы удалили определенный столбец, используя его имя с помощью pop(). Функция pandas pop() обновляет исходный dataframe. Данные в удаленном столбце потеряны.

Пример 2

В этом примере мы попытаемся удалить столбец, которого нет в DataFrame.

Когда вы пытаетесь удалить несуществующий столбец с помощью pop(), функция выдает ошибку KeyError.

В этом руководстве на примерах Python мы узнали, как удалить столбец из DataFrame с помощью pop() с помощью хорошо подробных примеров программ.

Как удалить столбцы?

Чтобы удалить или удалить только один столбец из Pandas DataFrame, вы можете использовать ключевое слово del, функцию pop() или функцию drop() в кадре данных.

Чтобы удалить несколько столбцов из DataFrame Pandas, используйте функцию drop().

Пример 1: с помощью ключевого слова del

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

Мы удалили столбец химии из DataFrame.

Пример 2: с помощью функции pop()

В этом примере мы создадим DataFrame, а затем будем использовать функцию pop() для удаления определенного столбца.

Мы удалили столбец химии из DataFrame.

Пример 3: с помощью функции drop()

В этом примере мы будем использовать функцию drop() для удаления определенного столбца. Мы используем метку столбца для удаления.

Пример 4: с помощью функции drop()

В этом примере мы будем использовать функцию drop() для удаления нескольких столбцов. Мы используем массив меток столбцов для выбора столбцов для удаления.

Мы узнали, как удалить столбец из Pandas DataFrame, используя ключевое слово del, метод pop() и метод drop(), с помощью хорошо подробных примеров Python.

Источник

data_client

Как добавить столбец в Pandas Dataframe?

При работе с Dataframe в Pandas одной из распространённой задачей является добавление нового столбца. В этой статье мы рассмотрим несколько способов, как это можно сделать.

Для работы нам понадобится учебный пример:

import pandas as pd
city_data = <
‘Город’:[‘Москва’, ‘Казань’, ‘Владивосток’, ‘Санкт-Петербург’, ‘Калининград’],
‘Дата основания’:[‘1147’, ‘1005’, ‘1860’, ‘1703’, ‘1255’],
‘Площадь’:[‘2511’, ‘516’, ‘331’, ‘1439’, ‘223’],
‘Население’:[‘11,9’, ‘1,2’, ‘0,6’, ‘4,9’, ‘0,4’],
‘Погода’:[‘8’, ‘8’, ’17’, ‘9’, ’12’] >
city_df = pd.DataFrame(city_data)
city_df

Способ 1. Добавление столбца в Pandas при помощи списка

Давайте сформируем новый список, который будет соответствовать содержанию нового столбца:

сity_size = [‘Большой’, ‘Большой’, ‘Средний’, ‘Большой’, ‘Средний’]

Способ 2. Добавление столбца в Pandas при помощи метода insert()

Встроенный в Pandas метод insert() позволяет добавлять столбцы при помощи одной строки кода. Его синтаксис следующий:
insert(loc, column, value, allow_duplicates = False), где

  • loc – номер столбца справа, после которого мы хотим добавить новый столбец
  • column – название столбца
  • value – значения строк в столбце в виде списка
  • allow_duplicates – параметр, определяющий можно ли создавать столбец с одинаковым названием.

Давайте применим этот метод, добавив англоязычные названия городов, при этом поставим столбец после названия города на русском языке:

city_df.insert(1, «City», [‘Moscow’, ‘Kazan’, ‘Vladivostok’, ‘St. Petersburg’, ‘Kaliningrad’], False)
city_df

Способ 3. Добавление столбца в Pandas при помощи словаря и метода map()

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

city_df[‘Часовой пояс’] = city_df[‘Город’].map(city_timezone)
city_df

Источник

New Style Sound
Adblock
detector