Combinare e ripulire le colonne di testo
Concateni più colonne in un'unica stringa, rimuova gli spazi superflui e uniformi le etichette delle categorie incoerenti.
Combinare e ripulire le colonne di testo è una lezione Pandas & NumPy Academy gratuita su CoddyKit. Questa è la lezione 4 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.
Concatenare colonne di testo
Un'attività comune di preparazione dei dati consiste nel creare un'unica stringa combinando i valori di più colonne, ad esempio creando un nome completo a partire da nome e cognome oppure un indirizzo a partire da via, città e Paese. In Pandas, si concatenano le colonne di stringhe usando l'operatore + su due Series (o su una Series e una stringa letterale), dopo aver convertito le colonne numeriche in stringhe con .astype(str).
import pandas as pd
df = pd.DataFrame({
'first_name': ['Alice', 'Bob', 'Carol'],
'last_name': ['Smith', 'Jones', 'White']
})
df['full_name'] = df['first_name'] + ' ' + df['last_name']
print(df['full_name'].tolist())
# ['Alice Smith', 'Bob Jones', 'Carol White']Concatenare con colonne non di stringhe
Quando si combina una colonna numerica con una colonna di stringhe, è necessario convertire prima la colonna numerica in una stringa usando .astype(str). L'operatore + di Python genera un TypeError se si tenta di sommare una Series di stringhe e una Series di interi. Questa è una fonte comune di confusione quando si creano chiavi composite o etichette a partire da colonne di tipo misto.
import pandas as pd
df = pd.DataFrame({
'product': ['Widget', 'Gadget'],
'version': [3, 5]
})
# Must convert int to str before concatenating
df['label'] = df['product'] + ' v' + df['version'].astype(str)
print(df['label'].tolist())
# ['Widget v3', 'Gadget v5'].str.cat() per concatenare con un separatore
Series.str.cat(others, sep=) è il modo nativo di Pandas per concatenare più Series con un separatore, gestendo correttamente i valori NaN. Per impostazione predefinita, un NaN in una qualsiasi colonna fa sì che il risultato di quella riga sia NaN. Passi na_rep='?' (o qualsiasi altra stringa) per sostituire NaN con un segnaposto invece di propagarlo.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'city': ['NYC', 'LA', None],
'state': ['NY', None, 'TX'],
'country': ['USA', 'USA', 'USA']
})
# Join with ', ' — NaN rows produce NaN by default
df['location'] = df['city'].str.cat(
[df['state'], df['country']],
sep=', ',
na_rep='N/A'
)
print(df['location'].tolist())
# ['NYC, NY, USA', 'LA, N/A, USA', 'N/A, TX, USA']Normalizzare le etichette delle categorie incoerenti
Nelle colonne di categorie del mondo reale si trovano spesso etichette incoerenti dovute a errori di battitura, variazioni tra maiuscole e minuscole o abbreviazioni diverse (ad esempio, 'US', 'USA', 'United States'). La soluzione standard consiste nel creare un dizionario di mapping che associ ogni variante alla forma canonica, quindi applicarlo con .map() o .replace().
import pandas as pd
df = pd.DataFrame({
'country': ['US', 'USA', 'United States', 'uk', 'UK', 'United Kingdom']
})
canonical = {
'US': 'United States', 'USA': 'United States', 'United States': 'United States',
'uk': 'United Kingdom', 'UK': 'United Kingdom', 'United Kingdom': 'United Kingdom'
}
df['country_clean'] = df['country'].map(canonical)
print(df['country_clean'].tolist())
# ['United States', 'United States', 'United States',
# 'United Kingdom', 'United Kingdom', 'United Kingdom']Rimuovere gli spazi e uniformare le maiuscole
Prima di confrontare o raggruppare colonne di testo, esegua sempre come primo passaggio di pulizia la rimozione degli spazi superflui e la normalizzazione delle maiuscole e minuscole. Due valori che a una persona sembrano uguali (' Active' e 'active') vengono trattati da Pandas come diversi a causa dello spazio iniziale e della differenza tra maiuscole e minuscole. Una catena in due passaggi — prima rimozione degli spazi, poi conversione in minuscolo — risolve entrambi i problemi.
import pandas as pd
df = pd.DataFrame({
'status': [' Active', 'INACTIVE', 'active ', ' Pending ', 'ACTIVE']
})
df['status_clean'] = df['status'].str.strip().str.lower()
print(df['status_clean'].value_counts())
# active 3
# inactive 1
# pending 1Corrispondenza approssimata per correggere gli errori di battitura
Quando gli errori di battitura impediscono una corrispondenza esatta, la corrispondenza approssimata calcola punteggi di similarità tra stringhe. La libreria rapidfuzz (o la classica fuzzywuzzy) fornisce strumenti per la corrispondenza approssimata vettorializzata. Un flusso di lavoro tipico consiste nel trovare, per ogni valore distinto non pulito, il valore canonico più vicino sopra una determinata soglia di similarità e creare una mappa di correzione.
# Conceptual example (requires: pip install rapidfuzz)
from rapidfuzz import process
canonical_cities = ['New York', 'Los Angeles', 'Chicago', 'Houston']
dirty_values = ['New Yrok', 'Los Angelas', 'Chicagoo']
for dirty in dirty_values:
best, score, _ = process.extractOne(dirty, canonical_cities)
print(f'{dirty!r} -> {best!r} (score={score:.0f}%)')
# 'New Yrok' -> 'New York' (score=91%)
# 'Los Angelas'-> 'Los Angeles' (score=96%)
# 'Chicagoo' -> 'Chicago' (score=94%)Dividere le celle con più valori con explode()
A volte una cella contiene più valori separati da un delimitatore (ad esempio, 'python,sql,pandas'). Divida la colonna per ottenere delle liste, quindi chiami .explode() per creare una riga per ogni valore. In questo modo una cella estesa e compatta viene convertita in un formato long ordinato, in cui ogni riga contiene esattamente un valore — una struttura necessaria per le operazioni groupby e join su tali valori.
import pandas as pd
df = pd.DataFrame({
'user_id': [1, 2, 3],
'skills': ['python,sql', 'java,kotlin,sql', 'python']
})
df['skills'] = df['skills'].str.split(',')
exploded = df.explode('skills')
print(exploded)
# user_id skills
# 0 1 python
# 0 1 sql
# 1 2 java
# 1 2 kotlin
# 1 2 sql
# 2 3 pythonGestire codifiche miste nel testo
I dati testuali provenienti da fonti diverse possono presentare problemi di codifica — caratteri insoliti come \xa0 (spazio unificatore), \u2019 (apostrofo tipografico) o caratteri accentati alterati. Utilizzi .str.encode('ascii', errors='replace').str.decode('ascii') per una pulizia rapida limitata ai caratteri ASCII, oppure .str.normalize('NFKD') per scomporre gli accenti prima di rimuoverli.
import pandas as pd
import unicodedata
df = pd.DataFrame({'name': ['Caf\u00e9', 'na\u00efve', 'r\u00e9sum\u00e9']})
# Normalize and strip accents (NFKD decomposition + ascii encoding)
df['name_ascii'] = (
df['name']
.str.normalize('NFKD')
.str.encode('ascii', errors='ignore')
.str.decode('ascii')
)
print(df)
# name name_ascii
# 0 Cafe Cafe
# 1 naive naive
# 2 resume resumeCreare chiavi composite
In molti dataset è necessario creare una chiave composita a partire da più colonne per identificare univocamente una riga durante i join o la rimozione dei duplicati. La combinazione in un'unica stringa chiave di colonne testuali pulite (con spazi rimossi, convertite in minuscolo e normalizzate) garantisce una corrispondenza coerente tra fonti di dati in cui la stessa entità potrebbe essere scritta in modo leggermente diverso.
import pandas as pd
df = pd.DataFrame({
'first': [' Alice', 'BOB', ' Carol'],
'last': ['Smith ', 'JONES', 'White '],
'dob': ['1990-01-15', '1985-07-22', '1992-11-30']
})
df['match_key'] = (
df['first'].str.strip().str.lower() + '|' +
df['last'].str.strip().str.lower() + '|' +
df['dob']
)
print(df['match_key'].tolist())
# ['alice|smith|1990-01-15', 'bob|jones|1985-07-22', 'carol|white|1992-11-30']Applicare un elenco canonico di categorie
Dopo la pulizia, verifichi che tutti i valori di una colonna di testo categoriale appartengano a un insieme canonico noto. Un valore che non appartiene all'insieme può indicare una nuova categoria legittima oppure un errore nei dati. Registri o segnali i valori sconosciuti per una revisione manuale invece di eliminarli silenziosamente, così nulla passa inosservato.
import pandas as pd
df = pd.DataFrame({
'status': ['active', 'inactive', 'active', 'archived', 'unknown_status']
})
canonical = {'active', 'inactive', 'archived'}
unknown = df[~df['status'].isin(canonical)]['status'].unique()
print('Unknown statuses:', unknown.tolist())
# ['unknown_status']
# Flag unknown rows
df['status_valid'] = df['status'].isin(canonical)
print(df)Pipeline completa di pulizia del testo
Ecco una pipeline completa di pulizia del testo che applica tutte le tecniche di questa lezione: rimuovere gli spazi superflui, normalizzare le maiuscole e minuscole, correggere le abbreviazioni, rimuovere i caratteri speciali e convalidare rispetto a un elenco canonico. Questo è il tipo di funzione riutilizzabile che aggiungerebbe a qualsiasi modulo di acquisizione dei dati.
import pandas as pd
def clean_category_column(series, canonical_map, canonical_set):
cleaned = (
series
.str.strip()
.str.lower()
.map(lambda x: canonical_map.get(x, x)) # fix known variants
)
unknown = cleaned[~cleaned.isin(canonical_set)]
if not unknown.empty:
print('Warning: unknown values:', unknown.unique().tolist())
return cleaned
cmap = {'eng': 'engineering', 'hr': 'human_resources', 'mktg': 'marketing'}
cset = {'engineering', 'human_resources', 'marketing', 'finance'}
df = pd.DataFrame({'dept': ['Eng', 'HR', 'Marketing', 'MKTG', 'Legal']})
df['dept_clean'] = clean_category_column(df['dept'], cmap, cset)
print(df)Controllo rapido
Verifichi la Sua comprensione della combinazione e della pulizia delle colonne di testo.
Riepilogo della lezione
In questa lezione ha imparato a: concatenare le colonne con l'operatore + dopo aver convertito i numeri in stringhe, utilizzare str.cat(sep=) per concatenare con un delimitatore e gestire i valori NaN, applicare una mappa canonica con .map() per normalizzare le etichette incoerenti e utilizzare explode() per espandere in righe le celle contenenti liste. Applichi gli insiemi canonici per individuare tempestivamente i problemi di qualità dei dati. Ora vedrà come ordinare i DataFrame in base ai valori delle colonne.
Impara Python con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 30
- Lezioni
- 120
Domande Frequenti
La lezione «Combinare e ripulire le colonne di testo» è gratuita?
Sì — il testo completo di «Combinare e ripulire le colonne di testo» è 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 «Combinare e ripulire le colonne di testo»?
Concateni più colonne in un'unica stringa, rimuova gli spazi superflui e uniformi le etichette delle categorie incoerenti. 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 4 di 4.
Quanto tempo richiede la lezione «Combinare e ripulire le colonne di testo»?
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
- L'accessor .str
- Dividere e sostituire le stringhe
- Confrontare pattern con le espressioni regolari
- Combinare e ripulire le colonne di testo