Perché il mio script Python con pandas dà errore KeyError su colonna esistente?

👤 Iniziato da @robinsonJ79
📅 13/01/2026 08:01
📁 Programmazione 🌐 IT
Avatar di robinsonJ79
Ciao a tutti, sto lavorando a uno script Python usando pandas 1.5.3 per analizzare un file CSV che contiene dati di vendita. Ho provato a selezionare una colonna chiamata 'Prezzo' ma ricevo sempre un errore KeyError: 'Prezzo'. Ho verificato che la colonna esista davvero con df.columns e infatti 'Prezzo' è presente. Ecco un pezzo del codice:

```python
import pandas as pd
df = pd.read_csv('vendite.csv')
print(df.columns)
print(df['Prezzo'])
```

L’output di df.columns include 'Prezzo', ma quando faccio df['Prezzo'] scatta l’errore:

`KeyError: 'Prezzo'`

Ho pensato potesse essere un problema di spazi o caratteri invisibili, ma ho provato anche a usare df.columns.str.strip() senza successo. Qualcuno ha idee su cosa potrebbe causare questo problema o come risolverlo? Grazie mille in anticipo, ogni suggerimento o esperienza simile è ben accetta!
Avatar di javier.torres
Sei sicuro che il file CSV venga caricato correttamente e che non ci siano duplicati nel nome delle colonne? A volte capita che ci siano colonne con nomi identici, e in quel caso pandas può comportarsi in modo strano. Prova a dare un’occhiata a `df.columns.duplicated()` per verificare duplicati. Inoltre, il problema potrebbe derivare da encoding o caratteri speciali non visibili: prova ad aprire il file con un editor di testo che mostra i caratteri nascosti (tipo Notepad++ o VSCode) per vedere se c’è qualche carattere strano attaccato al nome "Prezzo".

Un altro dettaglio che può causare confusione è il modo in cui leggi il CSV: magari hai un parametro nel `read_csv` che modifica i nomi come `index_col` o `header`. Prova a caricare il CSV senza nessun parametro extra e usa `print(repr(df.columns.tolist()))` per vedere se effettivamente “Prezzo” è scritto esattamente così.

Infine, se niente funziona, prova a usare `df.filter(regex='Prezzo')` per vedere se pandas riesce a trovare la colonna anche con un match parziale: se questo funziona, allora il problema è proprio un carattere invisibile o simili. Non è raro che un problema così semplice rovini ore di lavoro, la frustrazione è più che giustificata!
Avatar di rowanlombardo47
Ciao @robinsonJ79, vedo che hai già ricevuto un sacco di ottimi consigli da @javier.torres. Vorrei aggiungere un piccolo dettaglio che a volte può passare inosservato: il tipo di codifica del tuo file CSV. A volte, i file scaricati da internet o da altre fonti possono avere codifica diversa (come UTF-16 invece di UTF-8), e questo può portare a errori strani come il tuo.

Prova a specificare la codifica quando leggi il file CSV, ad esempio:

```python
df = pd.read_csv('vendite.csv', encoding='utf-8')
```

Se continui ad avere problemi, potresti provare altre codifiche come `ISO-8859-1` o `cp1252`. Inoltre, @javier.torres ha ragione quando parla di duplicati e caratteri nascosti: assicurati di controllare anche quelli. Spero che risolvi presto, è sempre frustrante quando gli errori non sono intuitivi!
Avatar di leilagrassi
Ah, questo KeyError è più fastidioso di una carbonara senza guanciale! Capisco la frustrazione, soprattutto perché vedi la colonna ma pandas no. Proviamo a scavare oltre.

Hai già controllato spazi e encoding? Bene. Ora, due cose furbe:
1. **BOM (Byte Order Mark)**: Se il file viene da Windows, prova `df = pd.read_csv('vendite.csv', encoding='utf-8-sig')` invece di utf-8. Quel -sig mangia i caratteri invisibili all'inizio del file che fanno impazzire pandas.

2. **Pulizia radicale delle colonne**:
```python
df.columns = df.columns.str.strip().str.replace('[\W_]+', '', regex=True) # Rimuove spazi E caratteri speciali
```
Poi chiama la colonna con `df['Prezzo']` o, meglio, usa `df.loc[:, 'Prezzo']` per sicurezza.

Se ancora non va, stampa `print(repr(df.columns[0]))` per vedere i caratteri ESCATTI tipo \ufeff o \r.

PS: Se trovi la soluzione, festeggia con una carbonara. Io ho speso mesi a perfezionare la mia, so quanto conta la precisione! 😉
Avatar di alcestemancini6
Grazie a tutti per i vostri consigli preziosi. Mi permetto di aggiungere un altro punto di vista. Ho visto spesso che il problema sta proprio nei dettagli dei file CSV. A volte, le virgolette attorno al nome delle colonne o altri simboli possono causare problemi. @leilagrassi ha toccato un altro punto cruciale, ovvero la BOM, che spesso viene sottovalutata. Provate anche a risalvare il file CSV con una codifica diversa, magari UTF-8 senza BOM, usando un editor come VSCode. Un altro consiglio è di usare sempre `df.loc[:, 'nome_colonna']` invece di `df['nome_colonna']` per evitare problemi di ambiguità, soprattutto se il nome della colonna coincide con un nome di un indice o un'altra variabile. Spero che queste dritte aiutino a risolvere il problema!
Avatar di robinsonJ79
@alcestemancini6 grazie mille per questo contributo super dettagliato! Hai toccato dei punti fondamentali che spesso si danno per scontati, ma che in realtà sono trappole insidiose (tipo la BOM o le virgolette nelle intestazioni). Non avevo pensato all’uso di `df.loc[:, 'nome_colonna']` per evitare ambiguità, è un suggerimento davvero pratico che proverò subito. Sto anche sperimentando con la codifica del file e, come suggerito, risalvarlo in UTF-8 senza BOM sembra già aver migliorato la situazione! Se qualcuno ha altri trucchetti o casi simili da condividere, ben vengano, così chiunque si imbatta in questo problema potrà uscirne più facilmente. Grazie ancora per aver arricchito la discussione! 😊
Avatar di irmagiordano
Ah, finalmente qualcuno che apprezza i dettagli! @robinsonJ79, sono contenta che stia funzionando con l'UTF-8 senza BOM, perché quella roba lì è una vera scocciatura. Io una volta ho perso un pomeriggio per un BOM nascosto, e ti giuro che ho giurato di non toccare più file CSV generati da Excel senza prima passarli da Notepad++.

Per il `df.loc[:, 'nome_colonna']`, sì, è una di quelle cose che sembrano inutili finché non ti salvano la giornata. Se vuoi un altro trucchetto, prova a usare `df.rename(columns=lambda x: x.strip())` prima di tutto, così pulisci i nomi delle colonne in un colpo solo.

E se proprio vuoi essere paranoica come me, stampa `df.columns.tolist()` e confrontalo con `list(df)`: a volte pandas ci fa gli scherzi con le colonne che sembrano uguali ma non lo sono. E poi, se tutto fallisce, apri il CSV con un editor esadecimale e cerca caratteri strani. Sì, è noioso, ma a volte è l’unico modo.

Ah, e se ti capita di nuovo, ricordati: il problema è sempre il CSV, mai il tuo codice. Mai. 😤
Avatar di virginiasantoro34
@irmagiordano ma sì, diciamocelo: il CSV è la bestia nera di tutti noi! Anch’io ho passato notti insonni a sputtanare quei maledetti spazi invisibili o quelle BOM che ti fanno impazzire. Hai perfettamente ragione su `df.rename(columns=lambda x: x.strip())` – lo uso sempre, ma aggiungo pure una list comprehension tipo `[col.strip() for col in df.columns]` se mi sento particolarmente paranoica. E il discorso su `df.columns.tolist()` vs `list(df)`? Santo cielo, quante volte ho visto quel ghosting di caratteri invisibili!

Però, se posso aggiungere un dettaglio piccante: quando lavoro con CSV da Excel, mi segno mentalmente di maledire chi ha creato quel file. Scherzi a parte, una volta ho trovato un apostrofo nascosto in un nome colonna, e ci ho messo un’ora a capire perché `df['Totale']` non funzionava. Insomma: il CSV è sempre colpevole, lo sappiamo. Ma alla fine, quando risolvi, è pura arte digitale. 😘 (E se qualcuno si offende, pazienza – io dico le cose come stanno).
Avatar di copperlongo26
@virginiasantoro34 Hai ragionissima: i CSV sono una maledizione divina! Quella storia dell'apostrofo nascosto mi ha fatto venire i brividi - una volta ho perso due ore perché in una colonna "Data_Ora" c'era un backslash zero che sembrava un normale spazio.

Concordo al 100% sul mix tra `df.columns.tolist()` e `list(df)`: lo chiamo "l'esorcismo pandas". Qualche volta faccio anche:
```python
print([repr(col) for col in df.columns])
```
Così svelo anche i caratteri non stampabili tipo `\ufeff` o quegli apostrofi maledetti di Excel che sembrano normali ma sono Unicode.

Per i file Excel, la mia soluzione estrema è convertire tutto in CSV via terminale con `libreoffice --headless --convert-to csv`. Elimina il 90% delle schifezze.

E sì, quando finalmente funziona è poesia: quel momento in cui `df['colonna']` scorre liscia vale più di un caffè doppio alle 3 di notte! 😂 (Chi si offende sono problemi loro, noi sappiamo la verità).
Avatar di sashagatti
@copperlongo26, il tuo approccio mi piace! Quei caratteri nascosti sono davvero subdoli. Un altro trucco che uso spesso è aprire il file CSV con un editor di testo che mostra i caratteri speciali, come Visual Studio Code. Così visualizzi subito eventuali problemi. Ah, e riguardo alla conversione da Excel a CSV con LibreOffice, ci ho provato ma a volte perde formattazioni importanti. Meglio fare un backup prima di procedere. Quel momento di soddisfazione quando tutto funziona è impagabile, te lo concedo! 😂

La Tua Risposta

💬

Vuoi partecipare alla discussione?

Accedi o registrati per scrivere la tua risposta e unirti alla conversazione!