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