Come aggiungere i dati Panda in un file CSV esistente?


259

Voglio sapere se è possibile utilizzare la to_csv()funzione Panda per aggiungere un frame di dati a un file CSV esistente. Il file CSV ha la stessa struttura dei dati caricati.


6
Penso che il metodo suggerito da @tlingf sia migliore solo perché sta usando la funzionalità integrata della libreria panda. Suggerisce di definire la modalità come "a". "A" sta per APPEND 'df.to_csv (' my_csv.csv ', mode =' a ', header = False)'
— Ayrat,

1
La risposta di @KCzar considera sia i casi in cui il file CSV non è presente (ovvero aggiungi l'intestazione di colonna) sia quando il CSV è già presente (quindi aggiungi solo le righe di dati senza intestazioni). In ogni caso utilizza la modalità "append" e un separatore personalizzato, insieme ai controlli sul numero di colonne.
— TPPZ,

Risposte:


544

È possibile specificare una modalità di scrittura Python nella to_csvfunzione Panda . Per append è 'a'.

Nel tuo caso:

df.to_csv('my_csv.csv', mode='a', header=False)

La modalità predefinita è 'w'.


7
Grazie per la risposta. Questo mi permetterà di aggiungere un nuovo df su una riga. Ma potresti farmi sapere come posso aggiungere il nuovo df su colonna?
— datanew,

Sono stato in grado di realizzarlo rileggendo 'my_csv.csv', quindi concatenando il nuovo df e quindi salvandolo. Se conosci qualche metodo più semplice, per favore Fatemelo sapere. Apprezzo!
— datanew,

2
Come scrivere l'intestazione per il primo file e il resto delle righe viene automaticamente aggiunto ad esso?
— Etisha,

4
@Etisha qualcosa del generedf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
— Michele Tonutti

255

È possibile aggiungere a un CSV aprendo il file in modalità Aggiungi:

with open('my_csv.csv', 'a') as f:
    df.to_csv(f, header=False)

Se questo era il tuo CSV foo.csv:

,A,B,C
0,1,2,3
1,4,5,6

Se avete letto e quindi aggiungere, ad esempio, df + 6:

In [1]: df = pd.read_csv('foo.csv', index_col=0)

In [2]: df
Out[2]:
   A  B  C
0  1  2  3
1  4  5  6

In [3]: df + 6
Out[3]:
    A   B   C
0   7   8   9
1  10  11  12

In [4]: with open('foo.csv', 'a') as f:
             (df + 6).to_csv(f, header=False)

foo.csv diventa:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12

50
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Crea file se non esiste, altrimenti aggiungi
  • Aggiungi intestazione se il file viene creato, altrimenti salta

2
Manca un mode='a'parametro come to_csv(ovverodf.to_csv(f, mode='a', header=f.tell()==0)
— Gabriela Melo il

2
@GabrielaMelo È stato passato nella funzione open (nome file, 'a').
— Piyush

21

Una piccola funzione di aiuto che uso con alcune garanzie di controllo dell'intestazione per gestire tutto:

def appendDFToCSV_void(df, csvFilePath, sep=","):
    import os
    if not os.path.isfile(csvFilePath):
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep)
    elif len(df.columns) != len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns):
        raise Exception("Columns do not match!! Dataframe has " + str(len(df.columns)) + " columns. CSV file has " + str(len(pd.read_csv(csvFilePath, nrows=1, sep=sep).columns)) + " columns.")
    elif not (df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():
        raise Exception("Columns and column order of dataframe and csv file do not match!!")
    else:
        df.to_csv(csvFilePath, mode='a', index=False, sep=sep, header=False)

1
Cosa possiamo fare se l'ordine delle colonne non corrisponde?
— Jason Goal,

@JasonGoal df = df.reindex (ordinato (colonne df.), asse = 1); vedi stackoverflow.com/a/11067072/9095840 .
— markemus,

4

Inizialmente a partire da un frame di dati pyspark - ho avuto errori di conversione dei tipi (durante la conversione in pandas df e poi aggiungendo a csv) dati i tipi di schema / colonna nei miei frame di dati pyspark

Risolto il problema forzando tutte le colonne di ciascun df ad essere di tipo stringa e quindi aggiungendo questo a CSV come segue:

with open('testAppend.csv', 'a') as f:
    df2.toPandas().astype(str).to_csv(f, header=False)

3

Un po 'in ritardo alla festa, ma puoi anche utilizzare un gestore di contesto, se stai aprendo e chiudendo il tuo file più volte, o registrando dati, statistiche, ecc.

from contextlib import contextmanager
import pandas as pd
@contextmanager
def open_file(path, mode):
     file_to=open(path,mode)
     yield file_to
     file_to.close()


##later
saved_df=pd.DataFrame(data)
with open_file('yourcsv.csv','r') as infile:
      saved_df.to_csv('yourcsv.csv',mode='a',header=False)`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.