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.

Ayoub Ennassiri
quelle
6
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'.

In deinem Fall:

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

Der Standardmodus ist 'w'.

tlingf
quelle
7
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,3
1,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
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 wird:

,A,B,C
0,1,2,3
1,4,5,6
0,7,8,9
1,10,11,12
Andy Hayden
quelle
50
with open(filename, 'a') as f:
    df.to_csv(f, header=f.tell()==0)
  • Datei erstellen, sofern nicht vorhanden, andernfalls anhängen
  • Fügen Sie einen Header hinzu, wenn eine Datei erstellt wird, andernfalls überspringen Sie ihn
DeveScie
quelle
2
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
    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)
KCzar
quelle
1
Was können wir tun, wenn die Spaltenreihenfolge nicht übereinstimmt?
Jason Goal
@JasonGoal df = df.reindex (sortiert (df.columns), axis = 1); Siehe stackoverflow.com/a/11067072/9095840 .
Markemus
4

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)
Grant Shannon
quelle
3

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
@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)`
ai-shwarya
quelle