Wykrywanie i usuwanie duplikatów
Znajduj dokładne i częściowe duplikaty za pomocą duplicated() i drop_duplicates() oraz decyduj, który zduplikowany rekord zachować.
Wykrywanie i usuwanie duplikatów 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.
Dlaczego duplikaty mają znaczenie
Zdublowane wiersze po cichu zawyżają liczności, sumy przychodów i średnie, nie powodując żadnego komunikatu o błędzie. Zbiór danych sprzedażowych zawierający 500 zduplikowanych rekordów zamówień zawyży przychody dokładnie o sumę tych 500 zamówień. Wykrywanie i usuwanie duplikatów to jeden z pierwszych etapów czyszczenia danych, który należy wykonać przed agregowaniem lub modelowaniem, ponieważ błędy w kolejnych etapach narastają wskutek tego pojedynczego źródła zniekształceń.
import pandas as pd
df = pd.read_csv('orders.csv')
print('Shape before dedup:', df.shape)
print('Exact duplicates:', df.duplicated().sum())Znajdowanie dokładnych duplikatów
df.duplicated() zwraca serię wartości logicznych, w której dla każdego wiersza będącego dokładną kopią wcześniejszego wiersza znajduje się wartość True. Domyślna opcja keep='first' oznacza wszystkie wystąpienia poza pierwszym. Przekazanie keep=False oznacza każde wystąpienie duplikatu — jest to przydatne, gdy przed podjęciem decyzji o tym, który rekord zachować, chcesz przeanalizować wszystkie jego kopie.
# Mark only the second+ occurrences
partial_dups = df[df.duplicated(keep='first')]
print('Rows to remove:', len(partial_dups))
# Mark ALL copies of any duplicate
all_dups = df[df.duplicated(keep=False)]
print('Rows involved in duplicates:', len(all_dups))Usuwanie dokładnych duplikatów
Usuń dokładnie zduplikowane wiersze za pomocą df.drop_duplicates(). Domyślnie metoda zachowuje pierwsze wystąpienie i usuwa wszystkie pozostałe. Przekaż keep='last', aby zachować najnowszy rekord, jeśli dane zawierają znacznik czasu, a późniejsze wiersze są uznawane za bardziej wiarygodne. Zawsze sprawdź liczbę wierszy przed i po operacji, aby potwierdzić, że usunięto oczekiwaną ich liczbę.
df_clean = df.drop_duplicates(keep='first')
print('Rows removed:', len(df) - len(df_clean))
print('Shape after dedup:', df_clean.shape)Częściowe duplikaty: oparte na kluczu
Wiersze mogą być częściowymi duplikatami: mają wspólny klucz biznesowy (np. order_id), ale różnią się w innych kolumnach z powodu błędu w systemie źródłowym, który utworzył dwie wersje tego samego rekordu. Użyj df.duplicated(subset=['order_id']), aby znaleźć wiersze z tym samym kluczem, ale potencjalnie różnymi wartościami w innych kolumnach. Przeanalizuj te wiersze, zanim zdecydujesz, jak je uzgodnić.
key_dups = df[df.duplicated(subset=['order_id'], keep=False)]
print('Orders with duplicate IDs:')
print(key_dups.sort_values('order_id').head(10))Wybór duplikatu, który należy zachować
Gdy występują częściowe duplikaty, musisz zdecydować, który rekord jest wiarygodny. Typowe strategie to: zachowanie wiersza z najpóźniejszym znacznikiem czasu (czyli z najnowszą aktualizacją), wiersza z największą liczbą wartości innych niż null albo wiersza z wyższą kwotą, jeśli jeden z rekordów zawiera poprawki. Posortuj dane według kryterium rozstrzygającego, a następnie usuń duplikaty, zachowując pierwsze (lub ostatnie) wystąpienie.
# Keep the record with the latest update timestamp
df_sorted = df.sort_values('updated_at', ascending=False)
df_dedup = df_sorted.drop_duplicates(subset=['order_id'], keep='first')
print('Kept:', len(df_dedup), 'unique orders')Wykrywanie prawie duplikatów
Prawie duplikaty to wiersze reprezentujące tę samą jednostkę, ale różniące się nieznacznie — na przykład ta sama nazwa klienta z literówką albo ta sama transakcja z różnicą jednego centa wynikającą z zaokrąglenia. Wykrywanie dokładnych duplikatów ich nie znajdzie. Jednym z podejść jest grupowanie według kolumny klucza i zliczanie wartości: jeśli nazwa klienta występuje w kilku nieznacznie różniących się wariantach, przed usuwaniem duplikatów użyj .str.strip().str.lower(), aby ją ujednolicić.
df['customer_normalized'] = df['customer_name'].str.strip().str.lower()
near_dups = df.groupby('customer_normalized').size().sort_values(ascending=False)
print(near_dups[near_dups > 1].head())Usuwanie duplikatów za pomocą agregacji GroupBy
Jeśli trzeba połączyć zduplikowane wiersze, a nie tylko je usunąć, użyj groupby().agg(). Jeśli na przykład dwa wiersze reprezentują to samo zamówienie, ale jeden zawiera adres wysyłki, a drugi adres rozliczeniowy, można przeprowadzić agregację za pomocą 'first' (z preferowaniem wartości innych niż null) albo własnej funkcji, która łączy wartości inne niż null z duplikatów.
def coalesce(*args):
for a in args:
if pd.notna(a):
return a
return None
df_merged = df.groupby('order_id').agg(
customer=('customer_name', 'first'),
amount=('amount', 'max'),
date=('order_date', 'min')
).reset_index()
print(df_merged.head())Sprawdzanie zależności od kolejności wierszy
Wynik działania drop_duplicates(keep='first') zależy od kolejności wierszy. Jeśli DataFrame został wczytany z zapytania do bazy danych bez klauzuli ORDER BY, kolejność wierszy jest niedeterministyczna, co oznacza, że zachowany rekord może różnić się między uruchomieniami. Przed usuwaniem duplikatów zawsze sortuj dane według stabilnego klucza (np. klucza głównego lub znacznika czasu), aby proces był deterministyczny i powtarzalny.
# Sort by primary key before deduplication for deterministic results
df = df.sort_values('order_id').reset_index(drop=True)
df_clean = df.drop_duplicates(subset=['order_id'], keep='first')
print('Deterministic dedup complete.')Weryfikowanie wyniku usuwania duplikatów
Po usunięciu duplikatów zweryfikuj wynik za pomocą trzech kontroli: brak pozostałych dokładnych duplikatów (df_clean.duplicated().sum() == 0), brak zduplikowanych kluczy biznesowych (df_clean.duplicated(subset=['order_id']).sum() == 0) oraz wiarygodna oczekiwana liczba wierszy. Zapisz te kontrole jako asercje, aby w przypadku przyszłych zmian danych logika czyszczenia zgłaszała błąd w jednoznaczny sposób.
assert df_clean.duplicated().sum() == 0, 'Exact duplicates remain'
assert df_clean.duplicated(subset=['order_id']).sum() == 0, 'Duplicate order IDs remain'
print('Deduplication verified. Rows:', len(df_clean))Dokumentowanie usuniętych duplikatów
Dobre czyszczenie danych powinno być powtarzalne i możliwe do skontrolowania. Zapisz w słowniku raportu czyszczenia liczbę usuniętych wierszy, klucz użyty do usuwania duplikatów oraz regułę rozstrzygającą. Przechowuj ten raport razem z plikiem oczyszczonych danych, aby każda osoba uruchamiająca później potok mogła zweryfikować decyzje dotyczące czyszczenia bez ponownego analizowania kodu. Przejrzystość procesu czyszczenia danych buduje zaufanie do wyników analizy.
cleaning_log = {
'original_rows': len(df),
'dedup_key': 'order_id',
'tiebreak': 'keep first by updated_at desc',
'rows_removed': len(df) - len(df_clean),
'clean_rows': len(df_clean)
}
for k, v in cleaning_log.items():
print(f'{k}: {v}')Zapisywanie zbioru danych bez duplikatów
Zapisz DataFrame bez duplikatów do nowego pliku zamiast zastępować nim plik oryginalny. Dzięki temu zachowasz surowe dane na potrzeby audytu. Nazwij plik jednoznacznie, używając przyrostka _clean lub _deduped, i dodaj datę uruchomienia, aby można było rozróżnić kolejne przebiegi czyszczenia. Użyj formatu Parquet, aby szybko wczytywać dane w kolejnych etapach potoku.
from datetime import date
output_path = f'orders_clean_{date.today()}.parquet'
df_clean.to_parquet(output_path, index=False)
print(f'Saved {len(df_clean)} rows to {output_path}')Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat analizy danych z tego rozdziału.
Podsumowanie lekcji
W tej lekcji nauczysz się: wykrywać dokładne i częściowe duplikaty za pomocą duplicated() i drop_duplicates(), wybierać duplikat, który należy zachować, korzystając z sortowania i strategii agregacji, a także weryfikować wyniki za pomocą asercji i rejestrować decyzje dotyczące czyszczenia. Następnie zajmiemy się technikami wykrywania wartości odstających i postępowania z nimi.
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 „Wykrywanie i usuwanie duplikatów” jest bezpłatna?
Tak — pełny tekst „Wykrywanie i usuwanie duplikatów” 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 i usuwanie duplikatów”?
Znajduj dokładne i częściowe duplikaty za pomocą duplicated() i drop_duplicates() oraz decyduj, który zduplikowany rekord zachować. Ć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 i usuwanie duplikatów”?
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 i usuwanie duplikatów
- Wykrywanie i obsługa wartości odstających
- Ujednolicanie niespójnych kategorii
- Walidacja schematu i asercje