Pandas & NumPy Academy · Lekcja

map() i applymap() do operacji elementowych

Zastosuj funkcję do każdego elementu obiektu Series za pomocą map() oraz do każdej komórki DataFrame za pomocą applymap().

Lekcja 3 z 413 kroki

map() i applymap() do operacji elementowych 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.

Omówienie Series.map()

Series.map() stosuje funkcję, słownik lub inną Series do każdego elementu Series i zwraca nową Series. W przeciwieństwie do apply(), które może otrzymywać złożone obiekty, map() zawsze działa na pojedynczych wartościach skalarnych. Jest standardowym narzędziem do kodowania wartości kategorycznych, wyszukiwania etykiet w tabeli mapowania oraz stosowania prostych przekształceń element po elemencie.

import pandas as pd

codes = pd.Series(['N', 'S', 'E', 'N', 'W'])
region_names = {'N': 'North', 'S': 'South', 'E': 'East', 'W': 'West'}

names = codes.map(region_names)
print(names)

map() z funkcją

Funkcję, w tym lambda, należy przekazać do map(), gdy przekształcenie wymaga logiki, a nie tabeli mapowania. Funkcja otrzymuje za każdym razem jedną wartość skalarną, więc nie może uzyskać dostępu do innych wierszy ani kolumn. W przypadku prostego warunkowego przypisywania etykiet map() z funkcją jest czytelniejsze niż pętla, ale w przypadku dużych Series działa wolniej niż np.where().

prices = pd.Series([5.0, 25.0, 80.0, 150.0])

category = prices.map(lambda p: 'budget' if p < 20 else 'mid' if p < 100 else 'premium')
print(category)

map() a replace()

Zarówno map(), jak i replace() mogą zastępować wartości za pomocą słownika. Najważniejsza różnica polega na tym, że map() zwraca NaN dla wartości, której nie ma w słowniku (chyba że później użyją Państwo fillna()), natomiast replace() pozostawia niedopasowane wartości bez zmian. Należy użyć replace(), gdy chcą Państwo zmienić tylko określone wartości i pozostawić całą resztę bez zmian.

s = pd.Series(['A', 'B', 'C', 'D'])
map_dict = {'A': 'Alpha', 'B': 'Beta'}

print('map():', s.map(map_dict).tolist())      # C,D → NaN
print('replace():', s.replace(map_dict).tolist())  # C,D → unchanged

map() z Series (wyszukiwanie etykiet)

Do map() można przekazać inną Series jako tabelę wyszukiwania: wartości wywołującej Series są używane jako klucze do wyszukiwania wartości w indeksie Series będącej argumentem. Jest to zwięzły sposób na połączenie tabeli wyszukiwania bez pełnego wywołania merge() — działa jak zwektoryzowane wyszukiwanie w słowniku, którego tabela wyszukiwania jest indeksowana kluczem.

prices_lookup = pd.Series(
    [10.0, 25.0, 50.0],
    index=['SKU-001', 'SKU-002', 'SKU-003']
)

orders = pd.Series(['SKU-002', 'SKU-001', 'SKU-003', 'SKU-001'])
order_prices = orders.map(prices_lookup)
print(order_prices)

DataFrame.applymap() do operacji na poszczególnych komórkach

DataFrame.applymap() (w Pandas 2.1+ nazywane DataFrame.map()) stosuje funkcję do każdej pojedynczej komórki DataFrame. W przeciwieństwie do apply(axis=0), które otrzymuje całą kolumnę, applymap() za każdym razem otrzymuje jedną wartość skalarną. Jest przydatne do jednolitego formatowania wszystkich komórek — na przykład zaokrąglania każdej wartości liczbowej do 2 miejsc po przecinku lub zamiany każdego tekstu na małe litery.

df = pd.DataFrame({
    'a': [1.234, 5.678, 9.012],
    'b': [3.456, 7.890, 2.345]
})

# Round every cell to 1 decimal place
df_rounded = df.applymap(lambda x: round(x, 1))
print(df_rounded)

applymap() do formatowania tekstu

Należy zastosować spójne formatowanie tekstu do każdej komórki DataFrame zawierającej różne wartości tekstowe — na przykład zamienić wszystkie wartości na zapis z wielkimi literami na początku każdego wyrazu lub przekształcić None w pusty ciąg znaków. applymap(str.strip) usuwa białe znaki z każdej komórki całej DataFrame za pomocą jednego wywołania, co jest znacznie zwięźlejsze niż iterowanie po kolumnach i osobne stosowanie .str.strip() do każdej z nich.

df_str = pd.DataFrame({
    'name': [' Alice ', 'Bob  ', '  Carol'],
    'city': ['new york ', ' london', 'paris  ']
})

df_clean = df_str.applymap(str.strip)
print(df_clean)

applymap() do formatowania walut

Przygotowując DataFrame do wyświetlenia w raporcie, należy formatować komórki liczbowe jako ciągi znaków reprezentujące waluty za pomocą applymap(). Przekształca to liczby w ciągi gotowe do wyświetlenia bez modyfikowania bazowych typów danych — przekształcenie dotyczy wyłącznie końcowych wyników. Należy zastosować je jako ostatni krok przed wywołaniem to_excel() lub to_html() w celu wyeksportowania sformatowanej tabeli.

revenue_table = pd.DataFrame({
    'North': [12300.0, 9800.0],
    'South': [7400.0, 11200.0]
}, index=['Q1', 'Q2'])

formatted = revenue_table.applymap(lambda x: f'${x:,.0f}')
print(formatted)

Pandas 2.1: zmiana nazwy applymap na map

W Pandas 2.1 zmieniono nazwę DataFrame.applymap() na DataFrame.map(), aby zachować spójność z Series.map(). Stare applymap() nadal działa, ale wyświetla ostrzeżenie o wycofaniu. W kodzie produkcyjnym należy sprawdzić wersję Pandas i w przypadku wersji 2.1+ używać df.map(func), aby uniknąć ostrzeżeń o wycofaniu w przyszłych wydaniach.

import pandas as pd

print('Pandas version:', pd.__version__)

# Forward-compatible pattern:
if hasattr(pd.DataFrame, 'map'):
    df_clean = df_str.map(str.strip)  # Pandas 2.1+
else:
    df_clean = df_str.applymap(str.strip)  # Pandas < 2.1

print(df_clean)

map() do kodowania cech kategorycznych

Modele uczenia maszynowego wymagają danych wejściowych w postaci liczb, dlatego kolumny kategoryczne muszą zostać zakodowane. Należy użyć map() ze słownikiem kodowania całkowitego, aby przed przekazaniem DataFrame do modelu przekształcić kategorie w liczby porządkowe. W przypadku kategorii nominalnych, które nie mają naturalnego porządku, lepiej użyć pd.get_dummies() lub OneHotEncoder z biblioteki scikit-learn.

size_order = {'small': 0, 'medium': 1, 'large': 2, 'enterprise': 3}

df['size_encoded'] = df['order_size'].map(size_order)
print(df[['order_size', 'size_encoded']])

Łączenie map() w celu wieloetapowego wyszukiwania

Należy połączyć dwa wywołania map(), gdy potrzebne jest dwuetapowe wyszukiwanie: najpierw przekształcić kod w klucz pośredni, a następnie klucz pośredni w końcową etykietę. Można na przykład przekształcić SKU produktu w kod kategorii, a następnie kod kategorii w nazwę kategorii. Łączenie dwóch wywołań map() jest czytelniejsze niż zagnieżdżony słownik lub wywołanie merge, po którym następuje kolejne merge.

sku_to_cat_code = {'SKU-001': 'C1', 'SKU-002': 'C2', 'SKU-003': 'C1'}
cat_code_to_name = {'C1': 'Electronics', 'C2': 'Apparel'}

skus = pd.Series(['SKU-001', 'SKU-002', 'SKU-003'])
cat_names = skus.map(sku_to_cat_code).map(cat_code_to_name)
print(cat_names)

Obsługa wartości pustych element po elemencie za pomocą map

Podczas używania map(func) funkcja jest wywoływana również dla wartości NaN, co może spowodować TypeError, jeśli funkcja nie obsługuje wartości None. Należy opakować funkcję kontrolą wartości pustej za pomocą pd.isna(x) albo użyć parametru na_action='ignore' w map(), aby pominąć wartości NaN i pozostawić je jako NaN w wynikach bez wywoływania funkcji.

s = pd.Series([1.0, None, 3.0, None, 5.0])

# na_action='ignore' skips NaN values
result = s.map(lambda x: x * 2, na_action='ignore')
print(result)

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat analizy danych z tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo: używać Series.map() do wyszukiwania wartości skalarnych za pomocą funkcji i słowników, używać DataFrame.applymap()/map() do formatowania poszczególnych komórek we wszystkich kolumnach oraz rozumieć różnicę między map() a replace() w obsłudze niedopasowanych wartości. Następnie omówimy łączenie metod za pomocą pipe() w celu tworzenia czytelnych potoków przekształceń.

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 „map() i applymap() do operacji elementowych” jest bezpłatna?

Tak — pełny tekst „map() i applymap() do operacji elementowych” 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 „map() i applymap() do operacji elementowych”?

Zastosuj funkcję do każdego elementu obiektu Series za pomocą map() oraz do każdej komórki DataFrame za pomocą applymap(). Ć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 „map() i applymap() do operacji elementowych”?

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. apply() dla kolumn i wierszy
  2. apply() z GroupBy
  3. map() i applymap() do operacji elementowych
  4. Łańcuchowe wywoływanie metod z pipe()
← Powrót do Pandas & NumPy Academy