Corso
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:

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.

