Anhängen von Pandas-Datenrahmen, die in einer for-Schleife generiert wurden

77

Ich greife auf eine Reihe von Excel-Dateien in einer for-Schleife zu. Ich habe dann die Daten in der Excel-Datei in einen Pandas-Datenrahmen gelesen. Ich kann nicht herausfinden, wie diese Datenrahmen zusammengefügt werden, um dann den Datenrahmen (der jetzt die Daten aus allen Dateien enthält) als neue Excel-Datei zu speichern.

Folgendes habe ich versucht:

for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    appended_data = pandas.DataFrame.append(data) # requires at least two arguments
appended_data.to_excel("appended.xlsx")

Vielen Dank!

El Confuso
quelle

Antworten:

151

Verwenden Sie pd.concatdiese Option, um eine Liste von DataFrame zu einem einzigen großen DataFrame zusammenzuführen.

appended_data = []
for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    # store DataFrame in list
    appended_data.append(data)
# see pd.concat documentation for more info
appended_data = pd.concat(appended_data)
# write DataFrame to an excel sheet 
appended_data.to_excel('appended.xlsx')
Biobirdman
quelle
1
Fantastisch, danke. Wissen Sie, ob es eine einfache Möglichkeit gibt, jedem DataFrame einen Bezeichner zur endgültigen Excel-Datei hinzuzufügen? Der Zweck wäre, verfolgen zu können, aus welcher Datei die Daten stammen.
El Confuso
4
Fügen Sie beim Lesen der Daten eine neue Spalte mit dem Dateinamen hinzu. Könnte so einfach sein wie data['filename'] = infile.
Biobirdman
1
Toll! Vielen Dank. Wenn jemand in der Zukunft dies versuchen möchte, ersetzen Sie einfach die ]durch eine nicht hochgestellte :)
El Confuso
6
@FaCoffee, entfernen Sie das axis=1aus dem Code, um die dfs untereinander zu binden. :)
anky
2
Sofern nicht anders angegeben, bedeutet "Anhängen" meiner Meinung nach Zeilen und nicht Spalten und würde empfehlen, axis=1diese Antwort zu entfernen .
Max Ghenis
41

Sie können dies versuchen.

data_you_need=pd.DataFrame()
for infile in glob.glob("*.xlsx"):
    data = pandas.read_excel(infile)
    data_you_need=data_you_need.append(data,ignore_index=True)

Ich hoffe es kann helfen.

ye jiawei
quelle
Danke, Alter, es ist sehr hilfreich
ihr Jiawei
1
Hallo @Ilya - vorausgesetzt, Sie beziehen sich auf Alexanders Beitrag im Link - die langsamere Leistung, auf die verwiesen wird, ist auf die Verwendung von DataFrame.appendOperation anstelle von list.appendOperation zurückzuführen - nicht auf die DataFrame.appendOperation anstelle einer DataFrame.concatOperation.
Charlie
Ich bin mir nicht sicher, wie Python den Speicher verwaltet, aber ich würde erwarten, dass die Append-Operation weniger oder gleich viel Speicher benötigt (da irrelevante Informationen durch Müll gesammelt werden), und die Concat-Operation verwendet wahrscheinlich Append 'under the Hood' - führend zu wenig, möglicherweise keine Leistungsverbesserung (und möglicherweise schlechtere Leistung angesichts des höheren Speicherbedarfs).
Charlie
2
Ich habe es versucht, aber mein data_you_need ist leer. Ich weiß nicht, was schief gelaufen ist
duckman