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.