Wykrywanie brakujących wartości
Użyj isna(), notna() i isnull(), aby znaleźć położenie wartości NaN w obiekcie Series lub DataFrame oraz policzyć brakujące wartości w każdej kolumnie.
Wykrywanie brakujących wartości to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Czym są brakujące wartości w Pandas?
W bibliotece Pandas brakująca wartość jest reprezentowana jako NaN (Not a Number) w kolumnach liczbowych oraz jako None lub pd.NaT w kolumnach z datami i czasem. Brakujące dane są częste w rzeczywistych zbiorach danych, ponieważ rekordy mogą być niekompletne, czujniki mogą ulec awarii, a operacje łączenia mogą powodować powstawanie niepasujących wierszy. Wykrywanie brakujących wartości jest zawsze pierwszym krokiem w procesie czyszczenia danych.
Pandas normalizuje None, float('nan') i numpy.nan do tej samej wewnętrznej reprezentacji NaN w kolumnach liczbowych.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', None, 'Carol'],
'age': [25, np.nan, 30],
'salary': [50000.0, 60000.0, np.nan]
})
print(df)
# name age salary
# 0 Alice 25.0 50000.0
# 1 None NaN 60000.0
# 2 Carol 30.0 NaNisna() i isnull()
isna() i isnull() są całkowicie identyczne — obie metody zwracają obiekt DataFrame lub Series o tym samym kształcie, wypełniony wartościami True wszędzie tam, gdzie brakuje wartości, oraz False w pozostałych miejscach. Pandas udostępnia obie nazwy wyłącznie z myślą o preferencjach użytkowników. Wyniku można bezpośrednio użyć jako maski logicznej do filtrowania lub dalszych obliczeń.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': [1, np.nan, 3],
'B': [np.nan, 2, np.nan]
})
print(df.isna())
# A B
# 0 False True
# 1 True False
# 2 False True
# Both are identical
print((df.isna() == df.isnull()).all().all()) # Truenotna() do znajdowania niebrakujących wartości
notna() (występująca również pod aliasem notnull()) jest odwrotnością isna() — zwraca True tam, gdzie wartości są obecne, oraz False tam, gdzie ich brakuje. Jest to przydatne, gdy chcesz ograniczyć dane do wierszy zawierających wartość w kluczowej kolumnie, na przykład wymagać, aby klucz główny lub zmienna docelowa nie miały wartości NaN.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3],
'email': ['a@x.com', None, 'c@x.com']
})
# Keep only rows where email is present
with_email = df[df['email'].notna()]
print(with_email)
# id email
# 0 1 a@x.com
# 2 3 c@x.comZliczanie brakujących wartości w poszczególnych kolumnach
Wywołanie .isna().sum() dla obiektu DataFrame sumuje wartości True (równe 1) osobno dla każdej kolumny, podając liczbę brakujących wartości w każdej kolumnie. To najważniejszy pierwszy krok w ocenie jakości nowego zbioru danych — pokazuje, które kolumny wymagają uwagi.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', None, 'Carol', None],
'age': [25, np.nan, 30, 22],
'salary': [50000, 60000, np.nan, np.nan]
})
missing_counts = df.isna().sum()
print(missing_counts)
# name 2
# age 1
# salary 2
# dtype: int64Odsetek brakujących wartości w poszczególnych kolumnach
Bezwzględna liczba wartości NaN jest mniej przydatna niż odsetek brakujących wartości, ponieważ zależy od rozmiaru zbioru danych. Podzielenie wyniku isna().sum() przez całkowitą liczbę wierszy (lub wywołanie isna().mean()) daje ułamek brakujących wartości, który można pomnożyć przez 100, aby uzyskać procent. W przypadku kolumn, w których brakuje ponad 30–50% wartości, często trzeba zdecydować, czy w ogóle je zachować.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': [1, np.nan, 3, np.nan, 5],
'B': [np.nan, 2, np.nan, 4, 5],
'C': [1, 2, 3, 4, 5]
})
missing_pct = (df.isna().mean() * 100).round(1)
print(missing_pct)
# A 40.0
# B 40.0
# C 0.0
# dtype: float64Tabela podsumowania brakujących wartości
Typowym wzorcem w eksploracyjnej analizie danych (EDA) jest utworzenie tabeli podsumowania brakujących wartości, która w jednym widoku pokazuje dla każdej kolumny ich liczbę, odsetek oraz dtype. Zapewnia to pełny obraz jakości danych przed podjęciem decyzji dotyczących czyszczenia. Możesz ją posortować, aby najpierw wyświetlić kolumny sprawiające największe problemy.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'col_a': [1, np.nan, 3],
'col_b': [np.nan, np.nan, 3],
'col_c': [1, 2, 3]
})
summary = pd.DataFrame({
'missing_count': df.isna().sum(),
'missing_pct': (df.isna().mean() * 100).round(1),
'dtype': df.dtypes
}).sort_values('missing_pct', ascending=False)
print(summary)
# missing_count missing_pct dtype
# col_b 2 66.7 float64
# col_a 1 33.3 float64
# col_c 0 0.0 float64Zliczanie brakujących wartości na poziomie wierszy
Brakujące wartości można również zliczać dla każdego wiersza, wywołując isna().sum(axis=1). Pomaga to identyfikować rekordy w większości puste (np. niekompletne odpowiedzi ankietowe), które można oznaczyć lub usunąć jako całość. Wiersz z wieloma brakującymi wartościami to zupełnie inny przypadek niż rozproszone braki na poziomie kolumn.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, np.nan, np.nan],
'b': [np.nan, 2, np.nan],
'c': [3, 4, np.nan]
})
# Count NaN per row
df['missing_count'] = df.isna().sum(axis=1)
print(df)
# a b c missing_count
# 0 1.0 NaN 3.0 1
# 1 NaN 2.0 4.0 1
# 2 NaN NaN NaN 3Filtrowanie wierszy z dowolnymi lub wszystkimi brakami
Użyj df[df.isna().any(axis=1)], aby znaleźć wiersze zawierające co najmniej jedną wartość NaN, lub df[df.isna().all(axis=1)], aby znaleźć wiersze, w których każda wartość to NaN. Filtry te pomagają wyodrębnić problematyczne rekordy do sprawdzenia przed podjęciem decyzji, jak je obsłużyć.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'x': [1, np.nan, np.nan],
'y': [2, 3, np.nan],
'z': [4, 5, np.nan]
})
# Rows with at least one NaN
has_any_nan = df[df.isna().any(axis=1)]
print('Any NaN:\n', has_any_nan)
# Rows where all values are NaN
all_nan = df[df.isna().all(axis=1)]
print('All NaN:\n', all_nan)
# x y z
# 2 NaN NaN NaNSprawdzanie wartości NaN w konkretnej kolumnie
Aby szybko sprawdzić pojedynczą kolumnę, wywołaj df['col'].isna().sum() lub użyj df['col'].isna().any(), aby uzyskać pojedynczą wartość logiczną (True, jeśli istnieje jakakolwiek wartość NaN). Te jednolinijkowe wyrażenia są przydatne w kontrolach poprawności danych lub instrukcjach rejestrowania informacji w potoku.
import pandas as pd
import numpy as np
df = pd.DataFrame({'price': [10.0, np.nan, 30.0, np.nan, 50.0]})
print('NaN count in price:', df['price'].isna().sum()) # 2
print('Any NaN in price?', df['price'].isna().any()) # True
print('All present?', df['price'].notna().all()) # FalseWizualizacja brakujących wartości za pomocą mapy cieplnej
W przypadku zbiorów danych z wieloma kolumnami mapa cieplna brakujących wartości jest bardziej informacyjna niż tabela liczb. Możesz łatwo utworzyć ją za pomocą biblioteki Seaborn: im ciemniejsza komórka, tym więcej brakujących danych w danej kombinacji kolumny i wiersza. Popularna biblioteka zewnętrzna o nazwie missingno udostępnia dedykowane wizualizacje brakujących wartości.
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(0)
df = pd.DataFrame(
np.where(np.random.rand(20, 5) > 0.7, np.nan, np.random.randn(20, 5)),
columns=['A', 'B', 'C', 'D', 'E']
)
# Heatmap of missing values
sns.heatmap(df.isna(), cbar=False, yticklabels=False)
plt.title('Missing Value Pattern')
plt.tight_layout()
plt.savefig('missing_heatmap.png')
print('Saved missing_heatmap.png')info() do szybkiego sprawdzania braków
df.info() wyświetla zwięzłe podsumowanie zawierające liczbę wartości niebędących nullami dla każdej kolumny. To najszybszy sposób na znalezienie kolumn z brakującymi wartościami w nowym zbiorze danych: każda kolumna, w której liczba wartości niebędących nullami jest mniejsza od całkowitej liczby wierszy, zawiera wartości NaN. Podsumowanie pokazuje również dtype i użycie pamięci.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3, 4, 5],
'age': [25, np.nan, 30, np.nan, 22],
'salary': [50000, 60000, np.nan, 70000, 80000]
})
df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 5 entries, 0 to 4
# Data columns (total 3 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 id 5 non-null int64
# 1 age 3 non-null float64
# 2 salary 4 non-null float64Szybkie sprawdzenie
Sprawdź, czy rozumiesz wykrywanie brakujących wartości w bibliotece Pandas.
Podsumowanie lekcji
W tej lekcji poznano następujące zagadnienia: isna() i isnull() są identyczne i zwracają maski logiczne wskazujące miejsca brakujących wartości, isna().sum() zlicza wartości NaN w poszczególnych kolumnach, a isna().mean()*100 podaje odsetek braków. Używaj df.info(), aby szybko uzyskać ogólny przegląd danych, oraz isna().any(axis=1), aby znaleźć wiersze zawierające co najmniej jedną wartość NaN. Następnie zajmiemy się usuwaniem brakujących wartości za pomocą dropna().
Często zadawane pytania
Czy lekcja „Wykrywanie brakujących wartości” jest bezpłatna?
Tak — pełny tekst „Wykrywanie brakujących wartości” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wykrywanie brakujących wartości”?
Użyj isna(), notna() i isnull(), aby znaleźć położenie wartości NaN w obiekcie Series lub DataFrame oraz policzyć brakujące wartości w każdej kolumnie. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?
Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Wykrywanie brakujących wartości”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?
Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wykrywanie brakujących wartości
- Usuwanie brakujących wartości
- Uzupełnianie brakujących wartości
- Interpolacja i zaawansowane uzupełnianie