Ласкаво просимо, друже, сьогодні ми поринемо в тему, яка не тільки важлива для обробки даних, але й досить поширена, коли ви працюєте з реальними наборами даних. Ми говоримо про ці набридливі 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
особливо корисно, якщо ви вже використовуєте його для інших маніпуляцій з даними.
Тепер давайте займемося масивами. Масиви трохи відрізняються від списків, і ви можете зіткнутися з ними, якщо працюєте з бібліотекою 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 та інші завдання обробки даних, ось кілька ресурсів, які можуть бути вам корисні:
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ