JavaRush /Java блог /Изучение Python /Удаление NaN с помощью Python
Автор
Артем Divertitto
Senior Android-разработчик в United Tech

Удаление NaN с помощью Python

Статья из группы Изучение Python

Добро пожаловать, приятель, сегодня мы погрузимся в тему, которая не только важна для обработки данных, но и довольно распространена, когда вы работаете с реальными наборами данных. Мы говорим об этих надоедливых NaN — сокращение от «Not a Number» («не число») — которые имеют тенденцию всплывать в ваших данных и мешать вашим вычислениям. Но не бойтесь! К концу этой статьи вы будете вооружены несколькими методами для изящной обработки и удаления NaN из списков и массивов в Python. Готовы? Давайте начнем!

Введение

Итак, у вас есть набор данных, и вы готовы применить к нему магию Python. Но подождите — что это? Некоторые из ваших точек данных не являются числами! Вместо этого они NaN (не число). Эти NaN могут проникнуть в ваш набор данных по разным причинам, таким как пропущенные значения или ошибки во время сбора данных. К сожалению, NaN могут сбить ваши вычисления и анализы, что приведет к неточным результатам. Но не волнуйтесь — вы так быстро все схватываете! В этой статье мы рассмотрим несколько методов удаления NaN из списков и массивов в Python.

Методы удаления NaN из списка

Начнем со списков. Списки в Python невероятно универсальны, и удаление из них значений NaN можно выполнить несколькими различными способами. Вот наиболее распространенные методы:

1. Использование List Comprehension

List comprehension — это лаконичный способ создания списков в Python, и он идеально подходит для фильтрации значений NaN. Вот как это можно использовать:


import math

data = [1, 2, float('nan'), 4, 5, float('nan'), 7]

# Удалить значения NaN с помощью спискового включения
clean_data = [x for x in data if not math.isnan(x)]

print(clean_data)

Объяснение:

  • Сначала мы импортируем модуль math для использования функции math.isnan(), которая проверяет, является ли значение NaN.
  • Список включения [x for x in data if not math.isnan(x)] создает новый список, содержащий только те элементы из data, которые не являются NaN.

Выход:


[1, 2, 4, 5, 7]

Отлично! Как видите, значения NaN отфильтрованы, и у вас остался чистый список.

2. Использование функции filter()

Другой подход заключается в использовании функции filter(), которая является встроенной функцией Python, которая создает итератор из элементов итерируемого объекта, для которого функция возвращает значение true.


import math

data = [1, 2, float('nan'), 4, 5, float('nan'), 7]

# Удаляем значения NaN с помощью filter() и math.isnan
clean_data = list(filter(lambda x: not math.isnan(x), data))

print(clean_data)

Объяснение:

  • filter() применяет лямбда-функцию lambda x: not math.isnan(x) к каждому элементу в data и возвращает итератор только с теми элементами, для которых функция возвращает True.
  • Затем мы преобразуем этот итератор обратно в список.

Вывод:


[1, 2, 4, 5, 7]

Прямо и понятно, не правда ли?

3. Использование библиотеки pandas

Если вы работаете с данными, скорее всего, вы уже используете библиотеку pandas. Он предоставляет простой и эффективный способ обработки NaN в списках.


import pandas as pd

data = [1, 2, float('nan'), 4, 5, float('nan'), 7]

# Преобразовать список в ряд pandas
data_series = pd.Series(data)

# Удалить значения NaN с помощью dropna()
clean_data = data_series.dropna().tolist()

print(clean_data)

Объяснение:

  • Сначала мы преобразуем список в ряд pandas, который представляет собой одномерный объект, подобный массиву.
  • Функция dropna() удаляет все значения NaN из ряда.
  • Наконец, мы преобразуем ряд обратно в list.

Вывод:


[1, 2, 4, 5, 7]

Использование pandas особенно полезно, если вы уже используете его для других манипуляций с данными.

Методы удаления NaN из массива

Теперь давайте займемся массивами. Массивы немного отличаются от списков, и вы можете столкнуться с ними, если работаете с библиотекой numpy. Вот как можно обрабатывать NaN в массивах.

1. Использование numpy.isnan() и булевой индексации

numpy обеспечивает очень интуитивный способ удаления NaN из массивов с использованием numpy.isnan() в сочетании с булевой индексацией.


import numpy as np

data = np.array([1, 2, np.nan, 4, 5, np.nan, 7])

# Удаление значений NaN с использованием булевой индексации
clean_data = data[~np.isnan(data)]

print(clean_data)

Объяснение:

  • np.isnan(data) возвращает логический массив, где True соответствует значениям NaN.
  • Оператор тильды ~ инвертирует логический массив, поэтому для значений, отличных от NaN, остается True.
  • Затем мы используем этот логический массив для индексации исходного массива, эффективно отфильтровывая NaN.

Вывод:


[1. 2. 4. 5. 7.]

Отлично, правда? Этот метод и мощный, и лаконичный.

2. Использование numpy.compress()

Функция numpy.compress() — это еще один способ отфильтровать NaN из массива, особенно если вы предпочитаете более явный подход.


import numpy as np

data = np.array([1, 2, np.nan, 4, 5, np.nan, 7])

# Создание булевой маски для значений, отличных от NaN
mask = ~np.isnan(data)

# Удаление значений NaN с помощью numpy.compress()
clean_data = np.compress(mask, data)

print(clean_data)

Объяснение:

  • Сначала мы создаем булеву маску mask, которая указывает, какие элементы не являются NaN.
  • numpy.compress(mask, data) затем сжимает массив, сохраняя только те элементы, где mask равен True.

Вывод:


[1. 2. 4. 5. 7.]

3. Использование pandas с массивами

Как и в списках, вы можете использовать pandas для обработки NaN в массивах.


import numpy as np
import pandas as pd

data = np.array([1, 2, np.nan, 4, 5, np.nan, 7])

# Преобразуем массив numpy в ряд pandas
data_series = pd.Series(data)

# Удаляем значения NaN с помощью dropna()
clean_data = data_series.dropna().to_numpy()

print(clean_data)

Объяснение:

  • Мы преобразуем массив numpy в pandas Series.
  • Используйте dropna() для удаления значений NaN.
  • Преобразуйте очищенный Series обратно в массив numpy.

Выходные данные:


[1. 2. 4. 5. 7.]

Pandas универсален, и этот метод хорошо работает, если вы переключаетесь между списками и массивами.

Резюме и заключение

Поздравляем! Вы только что изучили несколько методов удаления значений NaN из списков и массивов в Python. Используете ли вы list comprehension, filter() или pandas для списков или numpy для массивов, у вас есть инструменты, чтобы поддерживать чистоту данных и точность вычислений.

Вкратце:

  • Для списков: вы можете использовать list comprehension, filter() или библиотеку pandas.
  • Для массивов: numpy.isnan() с булевым индексированием, numpy.compress() или pandas могут быть вашими основными методами.

Помните, что выбранный вами метод зависит от ваших конкретных потребностей и библиотек, которые вы уже используете в своем проекте. Продолжайте практиковаться, и вскоре работа с NaN станет для вас второй натурой. У вас все отлично, и это всего лишь еще один шаг на вашем пути к Python!

Дополнительные ресурсы

Если вы хотите глубже погрузиться в обработку NaN и другие задачи обработки данных, вот несколько ресурсов, которые могут оказаться вам полезны:

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ