Vai al contenuto principale

Come salvare un DataFrame di Pandas in CSV

In Pandas, puoi salvare un DataFrame in un file CSV usando il metodo df.to_csv('your_file_name.csv', index=False), dove df è il tuo DataFrame e index=False evita che venga aggiunta una colonna indice.
Aggiornato 29 set 2026  · 7 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

Se crei un DataFrame o ne modifichi uno esistente, potresti volerlo esportare in modo che altre persone possano lavorarci, oppure salvarlo per usi futuri. Per esempio, potresti dover consegnare una previsione da un progetto di machine learning al tuo esaminatore o inviare un dataset modificato a un collega.

In Python, puoi esportare un DataFrame come file CSV usando il metodo .to_csv() di Pandas.

In questo articolo, ti guiderò attraverso i passaggi principali del processo e spiegherò i parametri del metodo.

Se vuoi imparare di più su Pandas, dai un'occhiata a questo corso su Data Manipulation with Pandas.

Inizierò con una risposta rapida per chi va di fretta, poi entrerò nei dettagli.

Risposta rapida: come salvare un DataFrame di Pandas in CSV

Per salvare un DataFrame di Pandas come CSV, usa il metodo DataFrame.to_csv():

df.to_csv('your_file_name.csv', index=False)

Sostituisci 'your_file_name.csv' con il nome e il percorso desiderati per il tuo file. L'argomento index=False impedisce a Pandas di aggiungere una colonna indice al tuo CSV.

Creare un DataFrame di Pandas

Ora passiamo alla risposta più lunga. Invece di creare un DataFrame da zero, importerò un dataset, lo modificherò e salverò il DataFrame risultante in formato CSV. Il primo passo è importare le librerie necessarie:

import pandas as pd
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler

Poi possiamo importare un dataset di seaborn. Il dataset importato è già un DataFrame di Pandas, quindi non serve trasformarlo.

# We’ll import the 'titanic' dataset from seaborn
df = sns.load_dataset('titanic')
print(df.head())
survived  pclass     sex   age  sibsp  parch     fare embarked  class  
0         0       3    male  22.0      1      0   7.2500        S  Third   
1         1       1  female  38.0      1      0  71.2833        C  First   
2         1       3  female  26.0      0      0   7.9250        S  Third   
3         1       1  female  35.0      1      0  53.1000        S  First   
4         0       3    male  35.0      0      0   8.0500        S  Third 
    who  adult_male deck  embark_town alive  alone  
0    man        True  NaN  Southampton    no  False  
1  woman       False    C    Cherbourg   yes  False  
2  woman       False  NaN  Southampton   yes   True  
3  woman       False    C  Southampton   yes  False  
4    man        True  NaN  Southampton    no   True  

Modificare un DataFrame di Pandas

Ora facciamo un po' di elaborazione per ottenere un nuovo DataFrame. Dato che il mio obiettivo è esplorare il metodo .to_csv() di Pandas, farò solo una normalizzazione min-max sulle variabili numeriche.

scaler = MinMaxScaler()
# Choose the columns that have integer or float data-types                                           
numerical columns - df.select_dtypes(include=['float64','int64']).columns
new_df = df.copy()
# The min-max scaler will represent all numbers on a 0-to-1 scale
new_df[numerical_columns] = scaler.fit_transform(df[numerical_columns])
print(new_df.head())
survived  pclass     sex       age  sibsp  parch      fare embarked    
0       0.0     1.0    male  0.271174  0.125    0.0  0.014151        S  
1       1.0     0.0  female  0.472229  0.125    0.0  0.139136        C  
2       1.0     1.0  female  0.321438  0.000    0.0  0.015469        S  
3       1.0     0.0  female  0.434531  0.125    0.0  0.103644        S  
4       0.0     1.0    male  0.434531  0.000    0.0  0.015713        S  
class   who  adult_male deck  embark_town alive  alone  
Third   man        True  NaN  Southampton    no  False  
First   woman      False   C    Cherbourg   yes  False  
Third   woman      False NaN  Southampton   yes   True  
First   woman      False   C  Southampton   yes  False  
Third   man        True  NaN  Southampton    no   True  

Salvare un DataFrame di Pandas come CSV

Useremo il metodo DataFrame.to_csv() per salvare il DataFrame modificato come file CSV.

new_df.to_csv('new_titanic.csv') 

Questo salverà il file CSV nella directory corrente. Se ti serve un ripasso, leggi questo tutorial su come ottenere la directory corrente in Python.

Nel modo in cui ho chiamato questo metodo, tutti i parametri sono stati lasciati ai valori predefiniti. Ora presenterò i parametri e come puoi modificarli in base alle tue esigenze.

Spiegazione dei parametri di DataFrame.to_csv()

Ecco lo stesso metodo .to_csv() elencato con tutti i parametri:

new_df.to_csv(
    path_or_buf='new_titanic.csv',
    sep=',',
    na_rep='',
    float_format=None,
    columns=[],
    header=True,
    index=True,
    index_label=None,
    mode='w',
    encoding='utf-8',
    quoting=csv.QUOTE_MINIMAL,
    lineterminator=os.linesep,
    storage_options={},
    compression='infer',
    quotechar='',
    chunksize=None,
    date_format=None,
    doublequote=True,
    escapechar=None,
    decimal='.',
    errors='strict'
)

Alcuni di questi parametri sono opzionali, come columns, encoding, quoting, lineterminator e storage_options, quindi ho semplicemente impostato dei valori per essi, non necessariamente quelli predefiniti.

Il primo parametro può essere una stringa, che sarà il nome del file, oppure un oggetto file. Guarda questo esempio:

with open('new_titanic.csv',  'w', encoding = 'utf=8') as file:
     new_df.to_csv(file)

Separatori e valori mancanti

Il parametro successivo è il separatore, che indica come sono separati i dati. Il separatore predefinito è la virgola, ma possiamo cambiarlo in tabulazione o punto e virgola. Un separatore a tab o punto e virgola può essere utile quando i dati esportati devono essere in un certo formato. Inoltre, per dati che contengono virgole, come i testi, usare la virgola come separatore può introdurre modifiche indesiderate.

Per esempio, se hai “Hello, world” come datapoint, allora se vuoi usare la virgola come separatore, ti servono anche le virgolette per mantenerlo come un singolo datapoint. Usare invece una tabulazione o un punto e virgola può essere l'opzione migliore, dato che può occupare meno memoria rispetto a virgole e virgolette.

new_df.to_csv('new_titanic.csv', sep = '\t')
new_df_tab = pd.read_csv('new_titanic.csv')
0\t0\t3\tmale\t22.0\t1\t0\t7.25\tS\tThird\tman...                                                                 
1\t1\t1\tfemale\t38.0\t1\t0\t71.2833\tC\tFirst...                                                                 
2\t1\t3\tfemale\t26.0\t0\t0\t7.925\tS\tThird\t...                                                                 
3\t1\t1\tfemale\t35.0\t1\t0\t53.1\tS\tFirst\tw...                                                                 
4\t0\t3\tmale\t35.0\t0\t0\t8.05\tS\tThird\tman... 

Il terzo parametro, na_rep, indica la rappresentazione dei valori mancanti. Scelte comuni sono lasciare la cella vuota oppure inserire “NaN” o “Na”, ma puoi anche inserire una stringa personalizzata. Nell'esempio seguente inserirò “Datacamp” per ogni valore mancante.

new_df.to_csv('new_titanic.csv', na_rep='Datacamp')
new_df_datacamp = pd.read_csv('new_titanic.csv') 
new_df_datacamp = pd.DataFrame(new_df_datacamp) 
#find the missing values
missing_values = new_df_datacamp.isnull().sum()
print(missing_values)
survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0

Gestire colonne e indici

Vediamo come sono rappresentati i valori mancanti per la colonna age:

print(new_df_datacamp['age'][:10])
     0.2711736617240512
     0.4722292033174164
    0.32143754712239253
     0.4345312892686604
     0.4345312892686604
               Datacamp
     0.6732847449107816
    0.01985423473234481
    0.33400351847197784
    0.17064589092736868

Se vuoi meno decimali, usa il parametro float_format per specificarne il numero. Qui ne useremo solo tre.

new_df.to_csv('new_titanic.csv', na_rep='Datacamp', float_format='%.3f')
new_df_datacamp = pd.read_csv('new_titanic.csv')
new_df_datacamp = pd.DataFrame(new_df_datacamp)
print(new_df_datacamp['age'][:10])
0.271
0.472
0.321
0.435
0.435
Datacamp
0.673
0.020
0.334
0.171

Se non vuoi vedere l'indice, imposta il parametro index su False.

Puoi anche decidere se mantenere i nomi delle colonne, usando il parametro header e impostandolo su True o False, che è l'approccio più comune (oppure puoi impostare tu i nomi delle colonne).

Il parametro columns ti permette di selezionare quali colonne mantenere. Il parametro index_label ti consente di impostare un nome per la colonna indice o un elenco di nomi se hai indici multipli.

new_df.to_csv(
    'new_titanic.csv', 
    index=True, 
    header=True, 
    columns=['age', 'alive'], 
    index_label='Index'
)
new_df = pd.read_csv('new_titanic.csv')
new_df = pd.DataFrame(new_df)
print(new_df.head())
  Index       age alive
      0  0.271174    no
      1  0.472229   yes
      2  0.321438   yes
      3  0.434531   yes
      4  0.434531    no

Apertura file, encoding e compressione

Il parametro mode ti permette di decidere cosa fare quando hai già un file CSV con lo stesso nome di quello che stai creando. Se imposti il parametro su “w” e hai già un file new_titanic.csv, quello nuovo sostituirà il vecchio. Se lo imposti su “x”, il nuovo file viene creato solo se non ne esiste già uno con lo stesso nome. Infine, se imposti il parametro su “a”, il nuovo contenuto verrà aggiunto a quello del file più vecchio con lo stesso nome (magari vuoi solo aggiungere qualche riga).

Il parametro encoding imposta la codifica del nuovo file. Se i tuoi dati contengono caratteri speciali, come lettere di altri alfabeti, puoi impostarlo su “utf-8” o un'altra codifica.

Il parametro compression stabilisce come viene compresso il nuovo file. Per impostazione predefinita è “infer”, il che significa che comprime il file in base all'estensione specificata, ma puoi anche indicare tu l'estensione preferita.

# Infer the compression
new_df.to_csv('new_titanic.csv.gz')
# Specify the compression explicitly
new_df.to_csv('new_data.csv.gz', compression='gzip')
# Specify the compression via a dictionary
new_df.to_csv(
    'new_data.zip', 
    compression={
        'method': 'zip', 
        'archive_name': 'data.csv'
    }
)

Come usare le virgolette

Il parametro quoting stabilisce quali dati mettere tra virgolette. Come detto prima, quando hai un separatore virgola e anche celle contenenti virgole (ad esempio testi), devi decidere cosa mettere tra virgolette.

# Default value, quotes only fields with special characters or separators like tabs and commas
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_MINIMAL)
# Quotes all fields
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_ALL)
# Quotes only fields with non-numeric values
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONNUMERIC)
# No field is quoted
new_df.to_csv('new_titanic.csv', quoting=csv.QUOTE_NONE)

Dimensione dei blocchi e dati data-ora

Il parametro chunksize specifica quanta parte del file verrà scritta per volta. Lasciando il valore predefinito, tutte le righe vengono scritte in una volta sola, ma puoi specificare un numero, utile quando il file è molto grande.

Il parametro date_format imposta la rappresentazione degli oggetti datetime. Puoi specificarlo usando il formato strftime.

# Write DataFrame to CSV with dates formatted as 'MM/DD/YYYY'
new_df.to_csv('new_titanic.csv', date_format='%m/%d/%Y')
# You can set datetime objects up to seconds
new_df.to_csv('new_titanic.csv', date_format='%Y-%m-%d %H:%M:%S')

Conclusione

Speriamo che ora tu sia pronto a esportare il tuo DataFrame nel formato più adatto alle tue esigenze!

Ti invito a continuare a imparare: ecco alcune risorse che puoi provare:


Tudor Mărginean's photo
Author
Tudor Mărginean

Sto terminando la laurea magistrale in Data Science presso l'Università di Bucarest, in Romania, con una tesi sulla previsione del flusso di traffico utilizzando vari modelli basati su Graph Neural Networks. Le principali competenze che ho acquisito sono la pulizia e visualizzazione dei dati in Python e Power BI, il preprocessing per diversi task di machine learning e la costruzione di modelli con PyTorch (o TensorFlow). Allo stesso tempo, come dottorando in filosofia, tengo seminari di logica del primo ordine mentre lavoro alla mia tesi sulla teoria bayesiana della conferma. Sono desideroso di imparare di più sui dati e sulla costruzione di modelli e di insegnare ciò che imparo.

Argomenti
Analisi dei dati
Data Science

Impara Pandas con questi corsi!

Corso

Manipolazione dei dati con pandas

4 ore
565.6K
Impara a importare e pulire dati, calcolare statistiche e creare visualizzazioni con pandas.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro