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 особливо корисно, якщо ви вже використовуєте його для інших маніпуляцій з даними.

< h2>Методи видалення 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() або < code>pandas можуть бути вашими основними методами.

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

Додаткові ресурси

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

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ