Изучаем pandas. Урок 4. Работа с пропусками в данных
Очень часто большие объемы данных, которые подготавливаются для последующего анализа, имеют пропуски. Для того, чтобы можно было использовать алгоритмы машинного обучения, строящие модели по этим данным, в большинстве случаев, необходимо эти пропуски чем-то и как-то заполнить. На вопрос “чем заполнять?” мы не будем отвечать в рамках данного урока, а вот на вопрос “как заполнять?” ответим.
- pandas и отсутствующие данные
- Замена отсутствующих данных
- Удаление объектов/столбцов с отсутствующими данными
pandas и отсутствующие данные
Для начала, хочется сказать, что в документации по библиотеке pandas есть целый раздел, посвященный данной тематике.
Для наших экспериментов создадим структуру DataFrame , которая будет содержать пропуски. Для этого импортируем необходимые нам библиотеки.
После этого создадим объект в формате csv . CSV – это один из наиболее простых и распространенных форматов хранения данных, в котором элементы отделяются друг от друга запятыми, более подробно о нем можете прочитать здесь.
Полученный объект df – это DataFrame с пропусками.
В нашем примере, у объектов с индексами 0 и 2 отсутствуют данные в поле percent . Отсутствующие данные помечаются как NaN . Добавим к существующей структуре еще один объект (запись), у которого будет отсутствовать значение в поле count.
Для начала обратимся к методам из библиотеки pandas , которые позволяют быстро определить наличие элементов NaN в структурах. Если таблица небольшая, то можно использовать библиотечный метод isnull . Выглядит это так.
Таким образом мы получаем таблицу того же размера, но на месте реальных данных в ней находятся логические переменные, которые принимают значение False , если значение поля у объекта есть, или True , если значение в данном поле – это NaN . В дополнение к этому можно посмотреть подробную информацию об объекте, для этого можно воспользоваться методом info() .
В нашем примере видно, что объект df имеет три столбца ( count , percent и price ), при этом в столбце price все объекты значимы – не NaN , в столбце count – один NaN объект, в поле percent – два NaN объекта. Можно воспользоваться следующим подходом для получения количества NaN элементов в записях.
Замена отсутствующих данных
Отсутствующие данные объектов можно заменить на конкретные числовые значения, для этого можно использовать метод fillna() . Для экспериментов будем использовать структуру df , созданную в предыдущем разделе.
Этот метод не изменяет текущую структуру, он возвращает структуру DataFrame , созданную на базе существующей, с заменой NaN значений на те, что переданы в метод в качестве аргумента. Данные можно заполнить средним значением по столбцу.
В зависимости от задачи используется тот или иной метод заполнения отсутствующих элементов, это может быть нулевое значение, математическое ожидание, медиана и т.п. Для замены NaN элементов на конкретные значения, можно использовать интерполяцию, которая реализована в методе interpolate(), алгоритм интерполяции задается через аргументы метода.
Удаление объектов/столбцов с отсутствующими данными
Довольно часто используемый подход при работе с отсутствующими данными – это удаление записей (строк) или полей (столбцов), в которых встречаются пропуски. Для того, чтобы удалить все объекты, которые содержат значения NaN воспользуйтесь методом dropna() без аргументов.
Вместо записей, можно удалить поля, для этого нужно вызвать метод dropna с аргументом axis=1 .
pandas позволяет задать порог на количество не- NaN элементов. В приведенном ниже примере будут удалены все столбцы, в которых количество не- NaN элементов меньше трех.
P.S.
Изучаем pandas. Урок 4. Работа с пропусками в данных : 4 комментария
Полезная статья, решила одну из моих проблем с кодом)
Интересно будет узнать, ЧЕМ заполнять пропуски?
В начале написал комментарий, частично повторив содержимое статьи))) Чем заполнять, определяется задачей, т.е. если можно заполнить средним значением, то заполняйте средним, если данные чувствительны к таким махинациям, то можно просто их выбросить.
Для этого импортируем необходимые нам библиотеки.
In [1]: import pandas as pd
In [2]: from io import StringIO
с первым понятно, про второе ничего не сказано – что, для чего….
Как очистить данные при помощи Pandas
Очистка данных — это процесс удаления, добавления или изменения данных для их анализа или других задач машинного обучения. Если очистить данные необходимо, начинать всегда следует с именно с этого.
Клайв Хамби сказал: «Данные — это новая нефть». И, как и нефть, они нуждаются в очистке.
Зачем нужна очистка данных?
Данные можно считать одним из самых важных активов компании. Ошибки или неточности в данных могут послужить причиной краха.
Но доступные нам данные ценны не сами по себе. Чтобы сделать их полезными, над ними нужно поработать. Например — удалить ненужные, отформатировать и модифицировать важные. В некоторых случаях для обработки данных приходится что-то добавлять. Скажем, можно добавить столбец языка, основываясь на уже имеющихся данных, или сгенерировать столбец со средним значением, основываясь на данных какого-нибудь другого столбца.
Английский для программистов
Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас
Вступление
Процесс очистки данных многоступенчатый, но не всегда необходимы все этапы.
Чтобы очистить данные, мы будем использовать язык программирования Python и библиотеку Pandas.
Python мы выбрали из-за его выразительности и доступности. Кроме того, многие эксперты выбирают этот язык для задач машинного обучения, поскольку его без проблем может изучить человек, не имеющий бэкграунда в информатике.
Что касается Pandas, это быстрая, мощная, гибкая и простая в использовании библиотека для работы с данными. Она имеет открытый код и очень популярна.
Прежде чем приступить к очистке данных, важно разобраться, какими, собственно, данными вы обладаете. Любые шаги по очистке зависят от того, что собой представляют ваши данные.
Как очистить данные: пошаговое руководство
Чтобы очистить данные, сперва их нужно правильно загрузить. В этом руководстве мы покажем базовые методы загрузки данных из CSV-файла. Больше вариантов чтения CSV вы найдете в документации.
От редакции Pythonist. На нашем сайте есть статья по этой теме — «Чтение файлов в формате CSV в Python».
Удаление дублирующихся данных
Чтобы очистить данные, некоторые шаги нужно сделать обязательно. Один из таких шагов — удаление дубликатов. И тут не важно, идет речь о текстовых или числовых данных. Если у вас слишком много дубликатов, это увеличивает время обработки данных.
Удаление эмодзи
Зачастую нам не нужны эмодзи в текстовых наборах данных. Мы можем их удалить всего одной строчкой кода. Сниппет, приведенный ниже, будет удалять эмодзи из датафрейма pandas столбец за столбцом. Этот сниппет можно найти на Stackoverflow.
Здесь мы переводим все данные в значения ASCII, а те, которые не могут быть переведены, игнорируем. После перевода в значения ASCII наш код переводит данные обратно. Так мы получаем все наши данные без эмодзи.
Перевод данных в нижний регистр
Весьма вероятно, что вам придется изменить регистр данных. Здесь мы переводим их в нижний. Больше примеров можно найти в документации.
Удаление множественных пробелов, табов и символов перевода строки
В каждом наборе данных присутствуют ненужные пробелы, табы и переходы на новую строку. Проблема в том, что табы и абзацы хорошо видно, тогда как пробелы можно не заметить, а они повлияют на обучение моделей.
Первые две строки кода заменяют табы и символы перевода строки на пустые строки. Третья строка ищет два и более пробелов при помощи регулярного выражения, а затем заменяет их на один пробел. Наконец, последняя строка обрезает данные с обоих концов, удаляя пробелы.
Удаление URL-адресов
Для получения данных многие пользуются опросами. Но люди невнимательно заполняют поля, и порой в этих данных встречаются URL-адреса. Регулярное выражение, приведенное ниже, удаляет URL. Вы можете использовать и любой другой regex-паттерн для поиска URL. Здесь найденные адреса заменяются пустой строкой.
Отбрасываем строки с пустыми данными
После выполнения предыдущих шагов по очистке в столбцах остаются пустые данные. От этих пустых строк нужно избавиться, иначе это создаст неопределенность при обучении модели. Чтобы удалить все строки с пустыми данными, мы используем два метода:
Первая строка кода удаляет все строки, содержащие np.nan , pd.NaT и None . Остальные удаляют строки, содержащие символы пустой строки. Второй метод быстрый, но если в столбце будет хотя бы пробел, он не сработает. Это еще одна причина обрезать лишние пробелы заранее.
Дальнейшая обработка данных
Иногда, чтобы очистить данные, бывает нужно отбросить некоторые столбцы, создать новый столбец из существующих данных или удалить строки, не содержащие определенных данных.
Здесь в третьей строке мы отбрасываем два столбца с именами Id и Name и возвращаем копию нового датафрейма.
Четвертая строка проверяет, содержит ли столбец Type строку frozen или green , затем возвращает True и сохраняет эту строку.
Строки с 7 по 17 создают новый столбец с именем Range на основе данных столбца Price . Используя лямбда-функцию, мы передаем каждую строку в функцию detect_price и возвращаем значение на основе цены. Затем возвращаемое значение присваивается новому столбцу в строке, переданной в функцию. Мы используем np.NaN , чтобы потом иметь возможность удалить эти строки при помощи df.dropna() .
Заключение
Процесс очистки данных — один из многих процессов, связанных с data science. Очищать и обрабатывать данные в каждом отдельном проекте нужно по-разному. В этой статье мы рассмотрели несколько методов очистки из числа самых востребованных. Вы можете создать собственный набор методов или использовать любой из множества существующих. Весь код можно посмотреть по ссылке.
Английский для программистов
Наш телеграм канал с тестами по английскому языку для программистов. Английский это часть карьеры программиста. Поэтому полезно заняться им уже сейчас
Как удалить строки со значениями NaN в Pandas
Часто вас может заинтересовать удаление строк, содержащих значения NaN, в кадре данных pandas. К счастью, это легко сделать с помощью функции pandas dropna() .
В этом руководстве показано несколько примеров использования этой функции в следующих pandas DataFrame:
Пример 1. Удаление строк с любыми значениями NaN
Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые имеют любые значения NaN:
Пример 2. Удаление строк со всеми значениями NaN
Мы можем использовать следующий синтаксис, чтобы удалить все строки, содержащие все значения NaN в каждом столбце:
В этом конкретном DataFrame не было строк со всеми значениями NaN, поэтому ни одна из строк не была удалена.
Пример 3. Удаление строк ниже определенного порога
Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые не имеют определенного, по крайней мере , определенного количества значений, отличных от NaN:
В самой первой строке исходного DataFrame не было по крайней мере 3 значений, отличных от NaN, так что это была единственная строка, которая была удалена.
Пример 4. Удаление строки со значениями Nan в определенном столбце
Мы можем использовать следующий синтаксис, чтобы удалить все строки, которые имеют значение NaN в определенном столбце:
Пример 5: сброс индекса после удаления строк с NaN
Мы можем использовать следующий синтаксис для сброса индекса DataFrame после удаления строк со значениями NaN:
pandas.DataFrame.dropna#
See the User Guide for more on which values are considered missing, and how to work with missing data.
Parameters axis , default 0
Determine if rows or columns which contain missing values are removed.
0, or ‘index’ : Drop rows which contain missing values.
1, or ‘columns’ : Drop columns which contain missing value.
Changed in version 1.0.0: Pass tuple or list to drop on multiple axes. Only a single axis is allowed.
Determine if row or column is removed from DataFrame, when we have at least one NA or all NA.