map() och applymap() för elementvisa operationer
Tillämpa en funktion på varje element i en Series med map() och på varje cell i en DataFrame med applymap().
map() och applymap() för elementvisa operationer är en gratis lektion i Pandas & NumPy Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Pandas & NumPy Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.
Översikt över Series.map()
Series.map() tillämpar en funktion, en ordlista eller en annan Series på varje element i en Series och returnerar en ny Series. Till skillnad från apply(), som kan ta emot komplexa objekt, arbetar map() alltid med individuella skalära värden. Det är standardverktyget för att koda kategoriska värden, slå upp etiketter i en mappningstabell eller tillämpa en enkel omvandling element för element.
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() med en funktion
Skicka en funktion, inklusive en lambda-funktion, till map() när omvandlingen innehåller logik snarare än en uppslagstabell. Funktionen tar emot ett skalärt värde i taget och kan därför inte komma åt andra rader eller kolumner. För en enkel villkorsstyrd etikettilldelning är map() med en funktion tydligare än en loop, men långsammare än np.where() för stora Series.
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() jämfört med replace()
Både map() och replace() kan ersätta värden med hjälp av en ordlista. Den viktiga skillnaden är att map() returnerar NaN för värden som inte finns i ordlistan, om Ni inte använder fillna() efteråt, medan replace() lämnar omatchade värden oförändrade. Använd replace() när Ni bara vill ändra specifika värden och låta allt annat vara som det är.
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 → unchangedmap() med en Series (etikettuppslagning)
Ni kan skicka en annan Series till map() som uppslagstabell: värdena i den anropande Series används som nycklar för att slå upp värden i indexet för Series-argumentet. Detta är ett koncist sätt att koppla en uppslagstabell utan ett fullständigt anrop till merge() – det fungerar som en vektoriserad uppslagning i en ordlista där uppslagstabellen är indexerad efter nyckel.
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() för cellvisa operationer
DataFrame.applymap() (kallas DataFrame.map() i Pandas 2.1+) tillämpar en funktion på varje enskild cell i en DataFrame. Till skillnad från apply(axis=0), som tar emot en hel kolumn, tar applymap() emot ett skalärt värde i taget. Det är användbart för att formatera alla celler enhetligt – till exempel avrunda varje numerisk cell till två decimaler eller omvandla varje textcell till gemener.
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() för textformatering
Tillämpa en enhetlig textformatering på varje cell i en DataFrame med blandade textvärden – till exempel genom att ändra alla värden till titeltext eller omvandla None till en tom sträng. applymap(str.strip) tar bort blanksteg från varje cell i hela DataFrame med ett enda anrop, vilket är betydligt mer koncist än att iterera över kolumner och tillämpa .str.strip() på var och en.
df_str = pd.DataFrame({
'name': [' Alice ', 'Bob ', ' Carol'],
'city': ['new york ', ' london', 'paris ']
})
df_clean = df_str.applymap(str.strip)
print(df_clean)applymap() för valutaformatering
När Ni förbereder en DataFrame för visning i en rapport kan Ni formatera numeriska celler som valutasträngar med applymap(). Detta omvandlar tal till visningsklara strängar utan att ändra de underliggande datatyperna – omvandlingen gäller endast det slutliga resultatet. Tillämpa den som sista steg innan Ni anropar to_excel() eller to_html() för att exportera den formaterade tabellen.
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: applymap byter namn till map
I Pandas 2.1 bytte DataFrame.applymap() namn till DataFrame.map() för att överensstämma med Series.map(). Den gamla applymap() fungerar fortfarande, men genererar en utfasningsvarning. Kontrollera Pandas-versionen i produktionskod och använd df.map(func) om Ni använder version 2.1 eller senare, så undviker Ni utfasningsvarningar i framtida versioner.
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() för kodning av kategoriska egenskaper
Maskininlärningsmodeller kräver numerisk indata, så kategoriska kolumner måste kodas. Använd map() med en ordlista för heltalskodning för att omvandla kategorier till ordinala tal innan Ni skickar en DataFrame till en modell. För nominella kategorier utan en naturlig ordning bör Ni i stället föredra pd.get_dummies() eller scikit-learns OneHotEncoder.
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']])Kedja map() för uppslagning i flera steg
Kedja två anrop till map() när Ni behöver en uppslagning i två nivåer: mappa först en kod till en mellanliggande nyckel och mappa sedan den mellanliggande nyckeln till en slutlig etikett. Ni kan till exempel mappa ett produkt-SKU till en kategorikod och därefter kategorikoden till ett kategorinamn. Att kedja två anrop till map() är tydligare än att använda en nästlad ordlista eller en merge följd av ytterligare en 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)Elementvis hantering av null-värden med map
När Ni använder map(func) anropas funktionen även för NaN-värden, vilket kan orsaka TypeError om funktionen inte hanterar None. Omslut funktionen med ett null-skydd med hjälp av pd.isna(x) eller använd parametern na_action='ignore' i map() för att hoppa över NaN-värden och lämna dem som NaN i resultatet utan att anropa funktionen.
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)Snabbtest
Testa Er förståelse av dataanalysbegreppen från den här lektionen.
Lektionssammanfattning
I den här lektionen har Ni lärt Er: att använda Series.map() för skalära uppslagningar med funktioner och ordlistor, att använda DataFrame.applymap()/map() för cellvis formatering över alla kolumner samt att förstå skillnaden mellan map() och replace() vid hantering av omatchade värden. Härnäst utforskar vi metodkedjor med pipe() för lättlästa omvandlingspipelines.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”map() och applymap() för elementvisa operationer” gratis?
Ja – hela texten till ”map() och applymap() för elementvisa operationer” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Pandas & NumPy Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”map() och applymap() för elementvisa operationer”?
Tillämpa en funktion på varje element i en Series med map() och på varje cell i en DataFrame med applymap(). Ni övar på Pandas & NumPy Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Pandas & NumPy Academy?
Du behöver inga förkunskaper. Utbildningen i Pandas & NumPy Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”map() och applymap() för elementvisa operationer”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Pandas & NumPy Academy-lektionen?
Ja. Varje Pandas & NumPy Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- apply() på kolumner och rader
- apply() med GroupBy
- map() och applymap() för elementvisa operationer
- Metodkedjor med pipe()