map() e applymap() per operazioni elemento per elemento
Applichi una funzione a ogni elemento di una Series con map() e a ogni cella di un DataFrame con applymap().
map() e applymap() per operazioni elemento per elemento è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Pandas & NumPy Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Panoramica di Series.map()
Series.map() applica una funzione, un dizionario o un'altra Series a ogni elemento di una Series e restituisce una nuova Series. A differenza di apply(), che può ricevere oggetti complessi, map() opera sempre su singoli valori scalari. È lo strumento standard per codificare valori categorici, cercare etichette in una tabella di mapping o applicare una semplice trasformazione elemento per elemento.
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() con una funzione
Passi una funzione, inclusa una lambda, a map() quando la trasformazione prevede una logica anziché una tabella di ricerca. La funzione riceve un valore scalare alla volta, quindi non può accedere ad altre righe o colonne. Per una semplice assegnazione condizionale di etichette, map() con una funzione è più chiaro di un ciclo, ma più lento di np.where() per Series di grandi dimensioni.
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() e replace() a confronto
Sia map() sia replace() possono sostituire valori usando un dizionario. La differenza principale è che map() restituisce NaN per qualsiasi valore non presente nel dizionario, a meno che non si usi successivamente fillna(), mentre replace() lascia invariati i valori non corrispondenti. Usi replace() quando desidera modificare solo valori specifici e lasciare tutto il resto invariato.
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() con una Series (ricerca di etichette)
È possibile passare un'altra Series a map() come tabella di ricerca: i valori della Series chiamante vengono usati come chiavi per cercare i valori nell'indice della Series argomento. È un modo conciso per unire una tabella di ricerca senza una chiamata completa a merge(): funziona come una ricerca vettorializzata in un dizionario, in cui la tabella di ricerca è indicizzata per chiave.
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() per operazioni sulle singole celle
DataFrame.applymap() (chiamato DataFrame.map() in Pandas 2.1+) applica una funzione a ogni singola cella di un DataFrame. A differenza di apply(axis=0), che riceve un'intera colonna, applymap() riceve un valore scalare alla volta. È utile per formattare tutte le celle in modo uniforme, ad esempio arrotondando ogni cella numerica a 2 cifre decimali o convertendo ogni cella testuale in minuscolo.
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() per la formattazione delle stringhe
Applichi una formattazione coerente delle stringhe a ogni cella di un DataFrame con valori misti, ad esempio convertendo tutti i valori in formato titolo o trasformando None in una stringa vuota. applymap(str.strip) rimuove gli spazi superflui da ogni cella dell'intero DataFrame con una sola chiamata, risultando molto più conciso rispetto all'iterazione sulle colonne e all'applicazione individuale di .str.strip() a ciascuna di esse.
df_str = pd.DataFrame({
'name': [' Alice ', 'Bob ', ' Carol'],
'city': ['new york ', ' london', 'paris ']
})
df_clean = df_str.applymap(str.strip)
print(df_clean)applymap() per la formattazione delle valute
Quando prepara un DataFrame da visualizzare in un report, formatti le celle numeriche come stringhe di valuta usando applymap(). In questo modo i numeri vengono convertiti in stringhe pronte per la visualizzazione senza modificare i tipi di dati sottostanti: la trasformazione riguarda solo l'output finale. Lo applichi come ultimo passaggio prima di chiamare to_excel() o to_html() per esportare la tabella formattata.
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 rinominato in map
In Pandas 2.1, DataFrame.applymap() è stato rinominato in DataFrame.map() per essere coerente con Series.map(). Il vecchio applymap() continua a funzionare, ma genera un avviso di deprecazione. Nel codice di produzione, verifichi la versione di Pandas e usi df.map(func) se utilizza la versione 2.1 o successive, così da evitare avvisi di deprecazione nelle versioni future.
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() per codificare le variabili categoriche
I modelli di machine learning richiedono input numerici, quindi le colonne categoriche devono essere codificate. Usi map() con un dizionario di codifica intera per convertire le categorie in numeri ordinali prima di fornire un DataFrame a un modello. Per le categorie nominali prive di un ordine naturale, preferisca pd.get_dummies() o OneHotEncoder di 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']])Concatenare map() per una ricerca a più passaggi
Concateni due chiamate a map() quando serve una ricerca a due livelli: prima mappi un codice su una chiave intermedia, quindi mappi la chiave intermedia sull'etichetta finale. Ad esempio, puoi mappare lo SKU di un prodotto sul codice della categoria e poi il codice della categoria sul nome della categoria. Concatenare due chiamate a map() è più chiaro rispetto a un dizionario annidato o a un merge seguito da un altro 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)Gestione elemento per elemento dei valori null con map
Quando usi map(func), la funzione viene chiamata anche per i valori NaN, causando potenzialmente un TypeError se la funzione non gestisce None. Avvolgi la funzione in un controllo dei valori null usando pd.isna(x) oppure usa il parametro na_action='ignore' in map() per ignorare i valori NaN e lasciarli come NaN nell'output senza chiamare la funzione.
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)Verifica rapida
Verifichi la sua comprensione dei concetti di analisi dei dati presentati in questa lezione.
Riepilogo della lezione
In questa lezione ha imparato a: usare Series.map() per cercare valori scalari con funzioni e dizionari, usare DataFrame.applymap()/map() per formattare le celle di tutte le colonne e comprendere la differenza tra map() e replace() nella gestione dei valori non corrispondenti. Prossimamente esploreremo il concatenamento dei metodi con pipe() per creare pipeline di trasformazione leggibili.
Domande Frequenti
La lezione «map() e applymap() per operazioni elemento per elemento» è gratuita?
Sì — il testo completo di «map() e applymap() per operazioni elemento per elemento» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Pandas & NumPy Academy, passa a CoddyKit PRO. Il corso Pandas & NumPy Academy include 4 lezioni in totale.
Cosa imparerò in «map() e applymap() per operazioni elemento per elemento»?
Applichi una funzione a ogni elemento di una Series con map() e a ogni cella di un DataFrame con applymap(). Eserciti Pandas & NumPy Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Pandas & NumPy Academy?
Non è richiesta alcuna esperienza precedente. Pandas & NumPy Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «map() e applymap() per operazioni elemento per elemento»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Pandas & NumPy Academy?
Sì. Ogni lezione Pandas & NumPy Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- apply() su colonne e righe
- apply() con GroupBy
- map() e applymap() per operazioni elemento per elemento
- Concatenare metodi con pipe()