Pandas & NumPy Academy · Lekcja

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.

Lekcja 3 z 413 kroki

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.

Bezpłatny start

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

  1. Wykrywanie i usuwanie duplikatów
  2. Wykrywanie i obsługa wartości odstających
  3. Ujednolicanie niespójnych kategorii
  4. Walidacja schematu i asercje
← Powrót do Pandas & NumPy Academy