- Not a Number — все о NaN / pd 5
- Присваивание значения NaN
- Фильтрование значений NaN
- Заполнение NaN
- Очистка данных с помощью Python и Pandas: обнаружение пропущенных значений
- Источники недостающих ценностей
- Начиная
- Стандартные недостающие значения
- Нестандартные недостающие значения
- Неожиданные пропущенные значения
- Обобщая недостающие значения
- Замена
- Вывод
- Изучаем pandas. Урок 4. Работа с пропусками в данных
- pandas и отсутствующие данные
- Замена отсутствующих данных
- Удаление объектов/столбцов с отсутствующими данными
Not a Number — все о NaN / pd 5
В предыдущих разделах вы видели, как легко могут образовываться недостающие данные. В структурах они определяются как значения NaN (Not a Value). Такой тип довольно распространен в анализе данных.
Но pandas спроектирован так, чтобы лучше с ними работать. Дальше вы узнаете, как взаимодействовать с NaN , чтобы избегать возможных проблем. Например, в библиотеке pandas вычисление описательной статистики неявно исключает все значения NaN .
Присваивание значения NaN
Если нужно специально присвоить значение NaN элементу структуры данных, для этого используется np.NaN (или np.nan ) из библиотеки NumPy.
Фильтрование значений NaN
Есть несколько способов, как можно избавиться от значений NaN во время анализа данных. Это можно делать вручную, удаляя каждый элемент, но такая операция сложная и опасная, к тому же не гарантирует, что вы действительно избавились от всех таких значений. Здесь на помощь приходит функция dropna() .
Функцию фильтрации можно выполнить и прямо с помощью notnull() при выборе элементов.
В случае с Dataframe это чуть сложнее. Если использовать функцию pandas dropna() на таком типе объекта, который содержит всего одно значение NaN в колонке или строке, то оно будет удалено.
ball | mug | pen | |
---|---|---|---|
blue | 6.0 | NaN | 6.0 |
green | NaN | NaN | NaN |
red | 2.0 | NaN | 5.0 |
Таким образом чтобы избежать удаления целых строк или колонок нужно использовать параметр how , присвоив ему значение all . Это сообщит функции, чтобы она удаляла только строки или колонки, где все элементы равны NaN .
ball | mug | pen | |
---|---|---|---|
blue | 6.0 | NaN | 6.0 |
red | 2.0 | NaN | 5.0 |
Заполнение NaN
Вместо того чтобы отфильтровывать значения NaN в структурах данных, рискуя удалить вместе с ними важные элементы, можно заменять их на другие числа. Для этих целей подойдет fillna() . Она принимает один аргумент — значение, которым нужно заменить NaN .
ball | mug | pen | |
---|---|---|---|
blue | 6.0 | 0.0 | 6.0 |
green | 0.0 | 0.0 | 0.0 |
red | 2.0 | 0.0 | 5.0 |
Или же NaN можно заменить на разные значения в зависимости от колонки, указывая их и соответствующие значения.
Источник
Очистка данных с помощью Python и Pandas: обнаружение пропущенных значений
Дата публикации Oct 5, 2018
Это начало нового проекта, и вы рады применить некоторые модели машинного обучения.
Вы посмотрите на данные и быстро поймете, что этоабсолютный беспорядок,
Согласно сIBM Data AnalyticsВы можете ожидать потратить до80% вашего времени очистки данных,
В этом посте мы рассмотрим ряд различныхочистка данныхзадачи с использованием PythonБиблиотека панд, В частности, мы сосредоточимся на, вероятно, самой большой задаче очистки данных,пропущенные значения,
Прочитав этот пост, вы сможетеБольшебыстро очистить данные, Мы все хотимтратить меньше времени на очистку данныхи больше времени на изучение и моделирование.
Источники недостающих ценностей
Прежде чем мы углубимся в код, важно понять источники недостающих данных. Вот несколько типичных причин отсутствия данных:
- Пользователь забыл заполнить поле.
- Данные были потеряны при переносе вручную из устаревшей базы данных.
- Произошла ошибка программирования.
- Пользователи решили не заполнять поле, связанное с их мнением о том, как результаты будут использоваться или интерпретироваться.
Как видите, некоторые из этих источников — просто случайные ошибки. В других случаях может быть более глубокая причина, по которой данные отсутствуют.
Важно понимать этиразличные типы недостающих данныхсо статистической точки зрения. Тип пропущенных данных будет влиять на то, как вы справитесь с заполнением пропущенных значений.
Сегодня мы узнаем, как обнаруживать пропущенные значения, и сделаем некоторые основные вменения. Для подробного статистического подхода дляработа с недостающими даннымиПосмотрите эти удивительные слайды от ученого Мэтта Бремса.
Имейте в виду, что вменение со средним или средним значением, как правило, является плохой идеей, поэтому не забудьте проверить слайды Мэтта для правильного подхода.
Начиная
Перед тем, как приступить к очистке набора данных, рекомендуется просто получить общее представление о данных. После этого вы можете составить план очистки данных.
Я хотел бы начать, задавая следующие вопросы:
- Каковы особенности?
- Какие ожидаемые типы (int, float, string, boolean)?
- Есть ли очевидные пропущенные данные (значения, которые Пандас может обнаружить)?
- Существуют ли другие типы пропущенных данных, которые не так очевидны (их нелегко обнаружить с помощью Pandas)?
Чтобы показать вам, что я имею в виду, давайте начнем работать с примером.
Данные, с которыми мы будем работать, очень малы.набор данных по недвижимости, Направляйтесь к нашемустраница GitHubвзять копиюCSV-файлтак что вы можете кодировать вместе.
Вот быстрый взгляд на данные:
Это намного меньший набор данных, чем тот, с которым вы обычно работаете. Несмотря на то, что это небольшой набор данных, он освещает множество реальных ситуаций, с которыми вы столкнетесь.
Хороший способ быстро оценить данные — взглянуть на первые несколько строк. Вот как вы бы это сделали в Pandas:
Я знаю, что сказал, что мы будем работать с Пандами, но вы можете видеть, что я также импортировал Numpy. Мы будем использовать это чуть позже, чтобы переименовать некоторые пропущенные значения, поэтому мы могли бы также импортировать его сейчас.
После импорта библиотек мы читаем файл csv в фрейм данных Pandas. Вы можете думать о кадре данных как о таблице.
С .head() Метод, мы можем легко увидеть первые несколько строк.
Теперь я могу ответить на мой оригинальный вопрос,каковы мои особенности?Из названий столбцов довольно легко определить следующие особенности:
- ST_NUM : Номер улицы
- ST_NAME : Название улицы
- OWN_OCCUPIED : Занят ли владелец резиденции
- NUM_BEDROOMS : Количество спален
Мы также можем ответить,Какие ожидаемые типы?
- ST_NUM : float или int . какой-то числовой тип
- ST_NAME : строка
- OWN_OCCUPIED : строка… Y («Да») или N («Нет»)
- NUM_BEDROOMS : float или int, числовой тип
Чтобы ответить на следующие два вопроса, нам нужно начать получать более глубокие панды ширины. Давайте начнем смотреть на примеры того, как обнаружить пропущенные значения
Стандартные недостающие значения
Итак, что я подразумеваю под «стандартными пропущенными значениями»? Это недостающие значения, которые Панды могут обнаружить.
Возвращаясь к нашему исходному набору данных, давайте посмотрим на столбец «Номер улицы».
В третьем ряду пустая клетка. В седьмом ряду есть значение «NA».
Очевидно, что оба эти значения отсутствуют. Давайте посмотрим, как Панды справляются с этим.
Взглянув на колонку, мы видим, что Панды заполнили пустое пространство «NA». Используя isnull() метод, мы можем подтвердить, что как пропущенное значение, так и «NA» были распознаны как пропущенные значения. Оба логических ответа True ,
Это простой пример, но он подчеркивает важный момент. Панды распознают как пустые ячейки, так и типы «NA» как пропущенные значения. В следующем разделе мы рассмотрим некоторые типы, которые Панды не распознают.
Нестандартные недостающие значения
Иногда это может быть случай, когда пропущенные значения имеют разные форматы
Давайте посмотрим на колонку «Количество спален», чтобы понять, что я имею в виду.
В этом столбце есть четыре пропущенных значения.
Из предыдущего раздела мы знаем, что Панды распознают «NA» как отсутствующее значение, но как насчет других? Давайте взглянем.
Как и прежде, Панды признали «NA» отсутствующим значением. К сожалению, другие типы не были распознаны.
Если есть несколько пользователей, вводящих данные вручную, то это обычная проблема. Может быть, я хотел бы использовать «н / д», но вы хотели бы использовать «н».
Простой способ обнаружить эти различные форматы — поместить их в список. Затем, когда мы импортируем данные, Pandas сразу же распознает их. Вот пример того, как мы это сделаем.
Теперь давайте еще раз посмотрим на этот столбец и посмотрим, что произойдет.
На этот раз все различные форматы были признаны пропущенными значениями.
Возможно, вы не сможете поймать все это сразу. Когда вы работаете с данными и видите другие типы пропущенных значений, вы можете добавить их в список.
Важно распознавать эти нестандартные типы пропущенных значений для суммирования и преобразования пропущенных значений. Если вы попытаетесь посчитать количество пропущенных значений до преобразования этих нестандартных типов, вы можете в конечном итоге пропустить множество пропущенных значений.
В следующем разделе мы рассмотрим более сложный, но очень распространенный тип пропущенных значений.
Неожиданные пропущенные значения
До сих пор мы видели стандартные пропущенные значения и нестандартные пропущенные значения. Что если у нас неожиданный тип?
Например, если ожидается, что наша функция будет строкой, но имеет числовой тип, то технически это также пропущенное значение.
Давайте посмотрим на колонку «Владелец занят», чтобы понять, о чем я говорю.
Из наших предыдущих примеров мы знаем, что Панды обнаружат пустую ячейку в седьмой строке как отсутствующее значение. Давайте подтвердим с помощью некоторого кода.
В четвертой строке находится число 12. Ответ для Owner Occupied должен быть явно строкой (Y или N), поэтому этот числовой тип должен быть пропущенным значением.
Этот пример немного сложнее, поэтому нам нужно продумать стратегию обнаружения пропущенных значений этих типов. Есть несколько разных подходов, но вот способ, которым я собираюсь проработать этот.
- Цикл по столбцу OWN_OCCUPIED
- Попробуйте превратить запись в целое число
- Если запись может быть преобразована в целое число, введите пропущенное значение
- Если число не может быть целым числом, мы знаем, что это строка, поэтому продолжайте
Давайте посмотрим на код, а затем подробно рассмотрим его.
В коде мы перебираем каждую запись в столбце «Владелец занят». Чтобы попытаться изменить запись на целое число, мы используем int(row) ,
Если значение можно изменить на целое число, мы изменим запись на отсутствующее значение, используя Numpy’s np.nan ,
С другой стороны, если это не может быть изменено на целое число, мы pass и продолжай.
Вы заметите, что я использовал try а также except ValueError , Это называетсяОбработка исключенийи мы используем это для обработки ошибок.
Если бы мы попытались изменить запись в целое число, и это не могло быть изменено, тогда ValueError будет возвращен, и код будет остановлен. Чтобы справиться с этим, мы используем обработку исключений для распознавания этих ошибок и продолжаем.
Другим важным фрагментом кода является .loc метод. Это предпочтительный метод Pandas для изменения записей на месте. Для получения дополнительной информации об этом вы можете проверитьДокументация панд,
Теперь, когда мы проработали различные способы обнаружения пропущенных значений, мы рассмотрим их обобщение и замену.
Обобщая недостающие значения
После того, как мы убрали пропущенные значения, мы, вероятно, захотим обобщить их. Например, мы можем посмотреть общее количество пропущенных значений для каждой функции.
В других случаях мы могли бы сделать быструю проверку, чтобы увидеть, есть ли у нас какие-либо пропущенные значения вообще.
Мы также можем получить общее количество пропущенных значений.
Теперь, когда мы суммировали количество пропущенных значений, давайте взглянем на несколько простых замен.
Замена
Часто вам придется выяснить, как вы хотите обрабатывать пропущенные значения.
Иногда вы просто хотите удалить эти строки, в других случаях вы их замените.
Как я упоминал ранее, это не следует воспринимать легкомысленно. Мы рассмотрим некоторые основные положения, но для подробного статистического подхода кработа с недостающими даннымиПосмотрите эти удивительные слайды от ученого Мэтта Бремса.
При этом, может быть, вы просто хотите заполнить пропущенные значения одним значением.
Скорее всего, вы можете сделать вменение на основе местоположения. Вот как ты это сделаешь.
Очень распространенный способ заменить пропущенные значения — использовать медиану.
Мы рассмотрели несколько простых способов заменить пропущенные значения, но не забудьте проверить слайды Мэтта для правильной техники
Вывод
Работа с грязными данными неизбежна.Очистка данныхэто просто часть процесса в проекте науки о данных.
В этой статье мы рассмотрели некоторые способы обнаружения, обобщения и замены пропущенных значений.
Чтобы узнать больше об очистке данных, ознакомьтесь с этимикниги по науке о данных,
Вооружившись этими методами, вы будете тратить меньше времени на очистку данных, а также больше времени на изучение и моделирование.
Источник
Изучаем pandas. Урок 4. Работа с пропусками в данных
Очень часто большие объемы данных, которые подготавливаются для последующего анализа, имеют пропуски. Для того, чтобы можно было использовать алгоритмы машинного обучения, строящие модели по этим данным, в большинстве случаев, необходимо эти пропуски чем-то и как-то заполнить. На вопрос “чем заполнять?” мы не будем отвечать в рамках данного урока, а вот на вопрос “как заполнять?” ответим.
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 элементов меньше трех.
Источник