Wie füge ich Pandas-Daten zu einer vorhandenen CSV-Datei hinzu?
259
Ich möchte wissen, ob es möglich ist, mit der Pandas- to_csv()Funktion einen Datenrahmen zu einer vorhandenen CSV-Datei hinzuzufügen. Die CSV-Datei hat dieselbe Struktur wie die geladenen Daten.
Ich denke, die von @tlingf vorgeschlagene Methode ist nur deshalb besser, weil er die eingebaute Funktionalität der Pandas-Bibliothek verwendet. Er schlägt vor, den Modus als "a" zu definieren. "A" steht für APPEND 'df.to_csv (' my_csv.csv ', mode =' a ', header = False)'
Ayrat
1
Die Antwort von @KCzar berücksichtigt sowohl die Fälle, in denen die CSV-Datei nicht vorhanden ist (dh die Spaltenüberschrift hinzufügen), als auch die Fälle, in denen die CSV bereits vorhanden ist (fügen Sie also nur die Datenzeilen ohne Überschriften hinzu). In jedem Fall werden der "Anhängen" -Modus und ein benutzerdefiniertes Trennzeichen verwendet sowie die Anzahl der Spalten überprüft.
TPPZ
Antworten:
544
Sie können einen Python-Schreibmodus in der Pandas- to_csvFunktion angeben . Zum Anhängen ist es 'a'.
Danke für die Antwort. Dadurch kann ich neue df zeilenweise anhängen. Aber können Sie mich wissen lassen, wie ich den neuen df spaltenweise anhängen kann?
Datum neu
Ich konnte es erreichen, indem ich die 'my_csv.csv' erneut las, dann die neue df konzentrierte und sie dann speicherte. Wenn Sie eine einfachere Methode kennen, lassen Sie es mich bitte wissen. Ich schätze!
Datum neu
2
Wie schreibe ich einen Header für die erste Datei und der Rest der Zeilen wird automatisch daran angehängt?
Etisha
4
@ Etisha so etwas wiedf.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Michele Tonutti
255
Sie können an eine CSV anhängen , indem Sie die Datei im Anhänge-Modus öffnen :
with open('my_csv.csv','a')as f:
df.to_csv(f, header=False)
Wenn dies Ihre CSV war , foo.csv:
,A,B,C
0,1,2,31,4,5,6
Wenn Sie das lesen und dann anhängen, zum Beispiel df + 6:
In[1]: df = pd.read_csv('foo.csv', index_col=0)In[2]: df
Out[2]:
A B C
01231456In[3]: df +6Out[3]:
A B C
07891101112In[4]:with open('foo.csv','a')as f:(df +6).to_csv(f, header=False)
Es fehlt ein mode='a'als Parameter für to_csv(dhdf.to_csv(f, mode='a', header=f.tell()==0)
Gabriela Melo
2
@GabrielaMelo Das wurde in der Funktion open (Dateiname, 'a') übergeben.
Piyush
21
Eine kleine Hilfsfunktion, die ich mit einigen Sicherheitsvorkehrungen zur Überprüfung von Headern verwende, um alles zu erledigen:
def appendDFToCSV_void(df, csvFilePath, sep=","):import os
ifnot 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):raiseException("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.")elifnot(df.columns == pd.read_csv(csvFilePath, nrows=1, sep=sep).columns).all():raiseException("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)
Anfangs mit einem Pyspark-Datenrahmen beginnen - Ich habe Typkonvertierungsfehler (beim Konvertieren in Pandas-DFs und beim Anhängen an CSV) aufgrund der Schema- / Spaltentypen in meinen Pyspark-Datenrahmen erhalten
Das Problem wurde behoben, indem alle Spalten in jedem df vom Typ string erzwungen und dann wie folgt an csv angehängt wurden:
with open('testAppend.csv','a')as f:
df2.toPandas().astype(str).to_csv(f, header=False)
Etwas spät zur Party, aber Sie können auch einen Kontextmanager verwenden, wenn Sie Ihre Datei mehrmals öffnen und schließen oder Daten, Statistiken usw. protokollieren.
from contextlib import contextmanager
import pandas as pd
@contextmanagerdef 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)`
Antworten:
Sie können einen Python-Schreibmodus in der Pandas-
to_csv
Funktion angeben . Zum Anhängen ist es 'a'.In deinem Fall:
Der Standardmodus ist 'w'.
quelle
df.to_csv(output_path, mode='a', header=not os.path.exists(output_path))
Sie können an eine CSV anhängen , indem Sie die Datei im Anhänge-Modus öffnen :
Wenn dies Ihre CSV war ,
foo.csv
:Wenn Sie das lesen und dann anhängen, zum Beispiel
df + 6
:foo.csv
wird:quelle
quelle
mode='a'
als Parameter fürto_csv
(dhdf.to_csv(f, mode='a', header=f.tell()==0)
Eine kleine Hilfsfunktion, die ich mit einigen Sicherheitsvorkehrungen zur Überprüfung von Headern verwende, um alles zu erledigen:
quelle
Anfangs mit einem Pyspark-Datenrahmen beginnen - Ich habe Typkonvertierungsfehler (beim Konvertieren in Pandas-DFs und beim Anhängen an CSV) aufgrund der Schema- / Spaltentypen in meinen Pyspark-Datenrahmen erhalten
Das Problem wurde behoben, indem alle Spalten in jedem df vom Typ string erzwungen und dann wie folgt an csv angehängt wurden:
quelle
Etwas spät zur Party, aber Sie können auch einen Kontextmanager verwenden, wenn Sie Ihre Datei mehrmals öffnen und schließen oder Daten, Statistiken usw. protokollieren.
quelle