Usuwanie brakujących wartości
Usuń wiersze lub kolumny zawierające NaN za pomocą dropna(), określając próg oraz analizowany podzbiór kolumn.
Usuwanie brakujących wartości to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 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.
Kiedy usuwać brakujące wartości?
Usuwanie wierszy z brakującymi wartościami jest najprostszą strategią imputacji, ale można je stosować wyłącznie wtedy, gdy dane są Missing Completely At Random (MCAR) — oznacza to, że prawdopodobieństwo braku wartości nie zależy ani od samej brakującej wartości, ani od żadnej innej zmiennej. Jeśli braki w danych mają charakter systematyczny (np. respondenci o niskich dochodach pomijają pole dotyczące wynagrodzenia), ich usunięcie wprowadza obciążenie. Przed podjęciem decyzji o usunięciu zawsze przeanalizuj wzorzec braków.
import pandas as pd
import numpy as np
# Example: randomly missing salary data (MCAR-like)
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Carol', 'Dave'],
'salary': [50000, np.nan, 70000, np.nan]
})
print('Before drop:', df.shape) # (4, 2)
print(df)dropna() — podstawowe użycie
DataFrame.dropna() domyślnie usuwa każdy wiersz zawierający co najmniej jedną wartość NaN. Zwraca nowy obiekt DataFrame; oryginał pozostaje niezmieniony, chyba że przekażesz inplace=True. W przypadku małych i średnich zbiorów danych to domyślne działanie często sprawdza się jako szybki pierwszy etap czyszczenia danych.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, np.nan, 3, np.nan],
'b': [10, 20, np.nan, 40],
'c': [100, 200, 300, 400]
})
cleaned = df.dropna()
print(cleaned)
# a b c
# 0 1.0 10.0 100
print('Original shape:', df.shape) # (4, 3)
print('Cleaned shape:', cleaned.shape) # (1, 3)how='all' — usuwanie tylko wierszy zawierających same wartości NaN
Przekazanie how='all' powoduje, że dropna usuwa wiersz tylko wtedy, gdy każda pojedyncza wartość w tym wierszu to NaN. Jest to znacznie mniej restrykcyjne niż domyślne how='any'. Użyj how='all', gdy zbiór danych zawiera rzadkie wiersze — wiersze z pewnymi danymi warto zachować, natomiast całkowicie puste wiersze są wyraźnie bezużytecznymi rekordami.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, np.nan, np.nan],
'b': [2, np.nan, np.nan],
'c': [3, 4, np.nan]
})
# Row 2 has ALL NaN — dropped
# Row 1 has partial NaN — kept with how='all'
cleaned = df.dropna(how='all')
print(cleaned)
# a b c
# 0 1.0 2.0 3.0
# 1 NaN NaN 4.0subset= — sprawdzanie tylko określonych kolumn
Parametr subset ogranicza listę kolumn sprawdzanych pod kątem NaN przy podejmowaniu decyzji o usunięciu wiersza. Jest to niezwykle przydatne, gdy tylko niektóre kolumny mają kluczowe znaczenie — na przykład wiersz powinien zostać usunięty, jeśli brakuje w nim kolumny user_id lub target, ale wartość NaN w opcjonalnych kolumnach cech jest dopuszczalna.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'user_id': [1, np.nan, 3],
'score': [88, 95, np.nan],
'notes': ['ok', 'good', np.nan]
})
# Drop row only if user_id is missing — score and notes NaN are ok
cleaned = df.dropna(subset=['user_id'])
print(cleaned)
# user_id score notes
# 0 1.0 88.0 ok
# 2 3.0 NaN NaNthresh= — minimalny wymóg dotyczący wartości innych niż null
Parametr thresh zachowuje wiersz tylko wtedy, gdy zawiera co najmniej thresh wartości innych niż NaN. Jest to bardziej elastyczne rozwiązanie niż how='any' lub how='all': można określić „zachowaj wiersz, jeśli dane znajdują się w co najmniej 3 z 5 kolumn”. Jest to przydatne w zbiorach danych, w których spodziewana jest pewna liczba braków, ale całkowicie puste wiersze powinny zostać usunięte.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, np.nan, np.nan],
'b': [2, 3, np.nan],
'c': [4, np.nan, np.nan],
'd': [5, 6, np.nan]
})
# Keep rows with at least 3 non-null values
cleaned = df.dropna(thresh=3)
print(cleaned)
# a b c d
# 0 1.0 2.0 4.0 5.0
# 1 NaN 3.0 NaN 6.0Usuwanie kolumn zamiast wierszy
Domyślnie dropna() usuwa wiersze (axis=0). Przekaż axis=1 (lub axis='columns'), aby zamiast tego usunąć kolumny zawierające dowolną wartość NaN. Jest to odpowiednie, gdy kolumna jest w większości pusta i dostarcza niewiele informacji — zachowanie jej tylko wprowadzałoby szum do modelu lub tabeli podsumowującej.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3],
'name': ['A', 'B', 'C'],
'temp': [np.nan, np.nan, np.nan], # completely empty column
'score': [80, 90, 85]
})
# Drop columns that have any NaN
cleaned = df.dropna(axis=1)
print(cleaned)
# id name score
# 0 1 A 80
# 1 2 B 90
# 2 3 C 85Usuwanie kolumn według progu brakujących wartości
Skutecznym rozwiązaniem jest usuwanie kolumn, w których przekroczony został określony odsetek brakujących wartości. Oblicz ułamek braków dla każdej kolumny, znajdź kolumny powyżej ustalonego progu (np. 50%) i usuń je za pomocą df.drop(columns=cols_to_drop). Jest to bardziej precyzyjne niż dropna(axis=1), które usuwa każdą kolumnę zawierającą choćby jedną wartość NaN.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a': [1, 2, np.nan, 4, 5],
'b': [np.nan, np.nan, np.nan, np.nan, 5], # 80% missing
'c': [1, np.nan, 3, 4, 5] # 20% missing
})
threshold = 0.5
high_missing = df.columns[df.isna().mean() > threshold]
print('Dropping:', high_missing.tolist()) # ['b']
cleaned = df.drop(columns=high_missing)
print(cleaned)Zachowywanie indeksu po dropna()
Po wywołaniu dropna() oryginalne indeksy wierszy zostają zachowane — jeśli usunięto wiersze 1 i 3, pozostały obiekt DataFrame ma indeksy 0, 2, 4. Często jest to pożądane, ponieważ można prześledzić pierwotne pozycje, ale czasami potrzebny jest indeks sekwencyjny zaczynający się od 0. Po usunięciu wierszy wywołaj .reset_index(drop=True), aby ponownie je ponumerować.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'val': [1, np.nan, 3, np.nan, 5]
})
cleaned = df.dropna()
print('With original index:')
print(cleaned) # indices 0, 2, 4
cleaned_reset = cleaned.reset_index(drop=True)
print('With reset index:')
print(cleaned_reset) # indices 0, 1, 2dropna() w potoku
Ponieważ dropna() zwraca obiekt DataFrame, naturalnie integruje się z łańcuchem metod. Umieszczenie dropna() między etapami wczytywania i analizy to przejrzysty wzorzec, który pozwala zachować czytelność potoku bez używania zmiennych tymczasowych. Możesz również łączyć tę metodę z query(), assign() i groupby().
import pandas as pd
import numpy as np
df = pd.DataFrame({
'region': ['East', 'West', None, 'East'],
'revenue': [100, np.nan, 300, 400]
})
result = (
df
.dropna(subset=['region', 'revenue'])
.groupby('region')['revenue'].sum()
)
print(result)
# region
# East 500.0
# dtype: float64Kiedy NIE usuwać: lepiej uzupełniać
Usuwanie wierszy prowadzi do utraty danych. W przypadku kolumn, w których brakuje mniej niż 5–10% wartości, zwykle lepiej zastosować uzupełnianie (imputację) niż usuwać wiersze. Jeśli ponadto brakujące wartości są skorelowane ze zmienną docelową (Missing Not At Random, MNAR), ich usunięcie wprowadza obciążenie. Zgodnie z ogólną zasadą należy usuwać dane tylko wtedy, gdy braki są rzeczywiście losowe, zbiór danych jest wystarczająco duży, aby utrata wierszy nie miała znaczenia, a kolumna lub wiersz nie zawiera żadnych możliwych do odzyskania informacji.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'user': ['Alice', 'Bob', 'Carol', 'Dave'],
'age': [25, np.nan, 30, np.nan]
})
missing_pct = df['age'].isna().mean()
print(f'Missing age: {missing_pct:.0%}') # 50%
# 50% missing is high — consider imputing instead of dropping
# df['age'].fillna(df['age'].median(), inplace=True)Praktyczny proces czyszczenia danych
Praktyczny proces obsługi brakujących wartości łączy kilka strategii dropna: najpierw usuwa całkowicie puste wiersze, następnie kolumny, w których brakuje ponad 60% wartości, potem wiersze pozbawione kluczowych kolumn identyfikatorów lub zmiennej docelowej, a na końcu uzupełnia pozostałe, rozproszone wartości NaN. Takie warstwowe podejście pozwala zachować możliwie dużą ilość danych.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3, np.nan],
'feature': [1.0, np.nan, 3.0, 4.0],
'useless': [np.nan, np.nan, np.nan, np.nan]
})
clean = (
df
.dropna(how='all') # remove all-NaN rows
.drop(columns=df.columns[df.isna().mean() > 0.9]) # remove >90% empty cols
.dropna(subset=['id']) # must have an ID
)
print(clean)
# id feature
# 0 1.0 1.0
# 1 2.0 NaN
# 2 3.0 3.0Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat usuwania brakujących wartości za pomocą dropna().
Podsumowanie lekcji
W tej lekcji nauczyłeś się, że: dropna() domyślnie usuwa wiersze zawierające NaN, how='all' usuwa tylko całkowicie puste wiersze, subset= ogranicza sprawdzanie do określonych kolumn, a thresh= zachowuje wiersze zawierające minimalną liczbę wartości innych niż null. Użyj axis=1, aby zamiast wierszy usuwać kolumny. W następnej części uzupełnimy brakujące wartości zamiast je usuwać, korzystając z fillna().
Ucz się Python dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „Usuwanie brakujących wartości” jest bezpłatna?
Tak — pełny tekst „Usuwanie 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 „Usuwanie brakujących wartości”?
Usuń wiersze lub kolumny zawierające NaN za pomocą dropna(), określając próg oraz analizowany podzbiór kolumn. Ć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 2 z 4.
Ile czasu zajmuje lekcja „Usuwanie 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