Ujednolicanie niespójnych kategorii
Normalizuj tekstowe kolumny kategorii, mapując aliasy, poprawiając literówki za pomocą dopasowania rozmytego i wymuszając kanoniczną listę wartości.
Ujednolicanie niespójnych kategorii to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 3 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.
Problem niespójnych kategorii
Gdy dane kategorii są wprowadzane przez ludzi, to samo pojęcie może występować pod wieloma różnymi zapisami: Electronics, electronics, ELECTRONICS, Electronicss. Grupowanie za pomocą groupby według tej kolumny tworzy dziesiątki małych grup zamiast jednej znaczącej grupy. Standaryzacja kategorii do postaci zgodnej z kanoniczną listą jest jednym z najważniejszych etapów czyszczenia przed agregacją lub utworzeniem cech na potrzeby uczenia maszynowego.
import pandas as pd
df = pd.read_csv('products.csv')
print(df['category'].value_counts().head(20))Normalizowanie wielkości liter i białych znaków
Pierwszym i najprostszym krokiem standaryzacji jest normalizacja wielkości liter i białych znaków. Zastosuj .str.strip().str.lower(), aby usunąć spacje na początku i końcu oraz zamienić wszystkie znaki na małe przed wykonaniem innych porównań. Ten pojedynczy krok łączy wiele wariantów: Electronics, electronics i ' Electronics ' po normalizacji stają się wartością electronics.
df['category_clean'] = df['category'].str.strip().str.lower()
print('Before:', df['category'].nunique())
print('After:', df['category_clean'].nunique())Mapowanie aliasów za pomocą słownika
Po normalizacji wielkości liter wiele wariantów nadal pozostaje odrębnych z powodu skrótów, synonimów lub starszych nazw. Utwórz słownik mapowania aliasów, w którym kluczami są warianty zapisu, a wartościami — forma kanoniczna. Zastosuj go za pomocą df['category_clean'].map(alias_map).fillna(df['category_clean']) — fillna zachowuje wartości, których nie ma w słowniku, zamiast zastępować je wartością NaN.
alias_map = {
'elect': 'electronics',
'elec': 'electronics',
'tech': 'electronics',
'clothing': 'apparel',
'clothes': 'apparel',
'garments': 'apparel'
}
df['category_clean'] = df['category_clean'].map(alias_map).fillna(df['category_clean'])
print(df['category_clean'].value_counts().head())Używanie str.replace do naprawy wzorców
Niektóre nazwy kategorii zawierają powtarzalne błędy formatowania, takie jak podwójne spacje lub końcowe cyfry. Użyj .str.replace() wraz z wyrażeniem regularnym, aby naprawić te wzorce jednocześnie we wszystkich wierszach. Na przykład .str.replace(r'\s+', ' ', regex=True) redukuje wiele spacji do jednej, a .str.replace(r'\d+$', '', regex=True) usuwa cyfry znajdujące się na końcu nazw kategorii.
df['category_clean'] = (
df['category_clean']
.str.replace(r'\s+', ' ', regex=True) # collapse spaces
.str.replace(r'\d+$', '', regex=True) # strip trailing numbers
.str.strip()
)
print(df['category_clean'].value_counts())Dopasowanie rozmyte za pomocą difflib
Gdy literówki są nieprzewidywalne, użyj dopasowania rozmytego, aby znaleźć najbliższą kanoniczną kategorię dla każdego wariantu. Wbudowana funkcja Pythona difflib.get_close_matches() zwraca najlepsze dopasowania z listy prawidłowych kategorii na podstawie podobieństwa ciągów znaków. Zastosuj ją w funkcji pomocniczej za pomocą df['category'].apply(), aby rozstrzygać warianty, których samo map() nie potrafi znaleźć.
from difflib import get_close_matches
CANONICAL = ['electronics', 'apparel', 'home', 'sports', 'beauty']
def fuzzy_fix(val):
matches = get_close_matches(str(val).lower().strip(), CANONICAL, n=1, cutoff=0.7)
return matches[0] if matches else val
df['category_fuzzy'] = df['category_clean'].apply(fuzzy_fix)
print(df[['category_clean', 'category_fuzzy']].head(10))Tworzenie kanonicznej listy kategorii
Zdefiniuj kanoniczne kategorie jawnie, zamiast wywnioskowywać je z danych. Lista zapisana na stałe wymusza sprawdzenie każdej wartości; wszystko, czego nie ma na liście, zostaje oznaczone jako nieznane. Przechowuj kanoniczną listę w pliku konfiguracyjnym lub w osobnej kolumnie DataFrame, aby można ją było łatwo aktualizować, gdy firma doda nową kategorię produktów, bez modyfikowania kodu czyszczenia.
CANONICAL_CATEGORIES = {
'electronics', 'apparel', 'home', 'sports',
'beauty', 'food', 'toys', 'automotive'
}
df['is_known_category'] = df['category_fuzzy'].isin(CANONICAL_CATEGORIES)
unknown = df[~df['is_known_category']]['category_fuzzy'].unique()
print('Unknown categories remaining:', unknown)Obsługa nieznanych kategorii
Nieznane kategorie, które po korekcie rozmytej nie pasują do żadnej wartości kanonicznej, należy grupować pod etykietą Other, a nie usuwać, aby nie tracić wierszy bez wyraźnego ostrzeżenia. Ustaw dla nich wartość 'other' za pomocą np.where() lub prostego przypisania warunkowego. Zapisz, ile wierszy przypisano do wartości 'other', i przeanalizuj je pod kątem wzorców, które mogą uzasadniać utworzenie nowej kategorii kanonicznej.
import numpy as np
df['category_final'] = np.where(
df['category_fuzzy'].isin(CANONICAL_CATEGORIES),
df['category_fuzzy'],
'other'
)
print(df['category_final'].value_counts())Wymuszanie typu danych Categorical
Po standaryzacji należy przekonwertować oczyszczoną kolumnę kategorii na typ danych Pandas Categorical z jawną listą prawidłowych kategorii. Wymusza to zgodność ze schematem: każda próba przypisania nieprawidłowej kategorii powoduje błąd. Zmniejsza to również zużycie pamięci, ponieważ napisy kategorii są wewnętrznie przechowywane jako kody całkowite, a także przyspiesza operacje groupby na dużych DataFrame.
df['category_final'] = pd.Categorical(
df['category_final'],
categories=list(CANONICAL_CATEGORIES) + ['other']
)
print(df['category_final'].dtype)
print(df['category_final'].cat.categories)Walidacja oczyszczonej kolumny
Po wykonaniu wszystkich kroków standaryzacji należy przeprowadzić końcową walidację: sprawdzić, czy w oczyszczonej kolumnie nie występuje żadna wartość spoza zbioru kanonicznego. Należy użyć assert df['category_final'].isin(valid_set).all(). Tę asercję należy umieścić na końcu funkcji czyszczącej, aby była wykonywana przy każdym uruchomieniu potoku i wykrywała regresje, gdy nowe dane surowe zawierają wcześniej nieznane etykiety kategorii.
valid_set = set(CANONICAL_CATEGORIES) | {'other'}
assert df['category_final'].isin(valid_set).all(), 'Invalid category found'
print('All categories valid. Distribution:')
print(df['category_final'].value_counts())Śledzenie zmian w standaryzacji
Należy utworzyć tabelę różnic pokazującą oryginalną wartość i jej oczyszczony zamiennik dla każdego zmienionego wiersza. Taki ślad audytowy pozwala właścicielom danych przejrzeć poszczególne mapowania oraz je zaakceptować lub odrzucić. Należy użyć maski logicznej do wybrania zmienionych wierszy i porównać kolumny oryginalną oraz końcową obok siebie. Tabelę różnic należy wyeksportować do pliku CSV, aby osoby nietechniczne mogły ją przejrzeć.
changed = df['category'] != df['category_final']
diff_table = df[changed][['category', 'category_final']].drop_duplicates()
diff_table.columns = ['original', 'mapped_to']
print(f'Unique mappings applied: {len(diff_table)}')
print(diff_table)Zapisywanie zestandaryzowanego zbioru danych
Przed zapisaniem należy zastąpić oryginalną, nieuporządkowaną kolumnę kategorii jej zestandaryzowaną wersją oraz usunąć pośrednie kolumny robocze. Słownik mapowania aliasów i próg korekty fuzzy należy przechowywać w konfiguracji potoku, aby standaryzacja była w pełni odtwarzalna. Uruchomienie czyszczenia dwa miesiące później na nowym zrzucie danych powinno dać identyczne wyniki dla tych samych wartości wejściowych.
df_out = df.drop(columns=['category_clean', 'category_fuzzy', 'is_known_category'])
df_out = df_out.rename(columns={'category_final': 'category'})
df_out.to_parquet('products_clean.parquet', index=False)
print('Saved. Category distribution:')
print(df_out['category'].value_counts())Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat koncepcji analizy danych omówionych w tej lekcji.
Podsumowanie lekcji
W tej lekcji nauczyłeś się: normalizować wielkość liter i białe znaki jako pierwszy krok standaryzacji, mapować aliasy i stosować fuzzy matching do poprawiania literówek oraz wymuszać użycie kanonicznej listy kategorii za pomocą typu Categorical i asercji. Następnie omówimy walidację schematu i asercje wykonywane w czasie działania, które chronią każdy etap potoku.
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 „Ujednolicanie niespójnych kategorii” jest bezpłatna?
Tak — pełny tekst „Ujednolicanie niespójnych kategorii” 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 „Ujednolicanie niespójnych kategorii”?
Normalizuj tekstowe kolumny kategorii, mapując aliasy, poprawiając literówki za pomocą dopasowania rozmytego i wymuszając kanoniczną listę wartości. Ć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 3 z 4.
Ile czasu zajmuje lekcja „Ujednolicanie niespójnych kategorii”?
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