Ich möchte mehrere CSV-Dateien aus einem Verzeichnis in Pandas lesen und sie zu einem großen DataFrame verketten. Ich habe es allerdings nicht herausgefunden. Folgendes habe ich bisher:
import glob
import pandas as pd
# get data file names
path =r'C:\DRO\DCL_rawdata_files'
filenames = glob.glob(path + "/*.csv")
dfs = []
for filename in filenames:
dfs.append(pd.read_csv(filename))
# Concatenate all data into one DataFrame
big_frame = pd.concat(dfs, ignore_index=True)
Ich denke ich brauche etwas Hilfe innerhalb der for-Schleife ???
dfs
Liste, finden Sie nicht die Linie ersetzen möchtendata = pd.read_csv(filename)
mitdfs.append(pd.read_csv(filename)
. Sie müssten dann die Liste durchlaufen undconcat
ich glaube nicht, dassconcat
eine Liste vondf
s funktioniert .big_frame = pd.concat(dfs, ignore_index=True)
? Wenn Sie eine Liste von Datenrahmen haben, müssen Sie die Liste durchlaufen und sich anbig_frame
dfs
jetzt eine Schleife durchführen , damit so etwas wiefor df in dfs: big_frame.concat(df, ignore_index=True)
funktionieren sollte. Sie können es auch versuchen,append
anstattconcat
auch.concat
sollte eine Liste von DataFrames genauso gut verarbeiten wie Sie. Ich denke, das ist ein sehr guter Ansatz.Antworten:
Wenn Sie in all Ihren
csv
Dateien dieselben Spalten haben , können Sie den folgenden Code ausprobieren. Ich habe hinzugefügt,header=0
damit nach dem Lesen diecsv
erste Zeile als Spaltenname vergeben werden kann.quelle
df = pd.concat((pd.read_csv(f) for f in all_files))
Außerdem sollte man vielleichtos.path.join(path, "*.csv")
stattdessen eine verwendenpath + "/*.csv"
, was das Betriebssystem unabhängig macht.df['filename'] = os.path.basename(file_)
in der for file_-Schleife. Sie sind sich nicht sicher, ob Sids Antwort dies zulässt?pandas.read_csv(f).assign(filename = foo)
im Generator.assign
wird den gesamten Datenrahmen einschließlich der neuen Spalte zurückgebenfilename
Eine Alternative zu darindaCoders Antwort :
quelle
pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
. Die inneren Klammern werden von Pandas Version 0.18.1glob.iglob
anstelle vonglob.glob
; Der erste kehrt zurück und iteriert (anstelle einer Liste) .quelle
df = pd.concat(map(lambda file: pd.read_csv(file, delim_whitespace=True), data_files))
functools.partial
, um Lambdas zu vermeidenDie Dask-Bibliothek kann einen Datenrahmen aus mehreren Dateien lesen:
(Quelle: http://dask.pydata.org/en/latest/examples/dataframe-csv.html )
Die Dask-Datenrahmen implementieren eine Teilmenge der Pandas-Datenrahmen-API. Wenn alle Daten passt in den Speicher, können Sie rufen
df.compute()
die Datenrahmen in eine Pandas Datenrahmen zu konvertieren.quelle
Fast alle Antworten hier sind entweder unnötig komplex (Glob Pattern Matching) oder basieren auf zusätzlichen Bibliotheken von Drittanbietern. Sie können dies in zwei Zeilen tun, indem Sie alles verwenden, was Pandas und Python (alle Versionen) bereits eingebaut haben.
Für ein paar Dateien - 1 Liner:
Für viele Dateien:
Diese Pandas-Linie, die den df setzt, verwendet drei Dinge:
pd.read_csv()
) die iterable (unsere Liste), die jedes CSV-Element in Dateipfaden ist.quelle
df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv))
df = pd.concat(map(pd.read_csv(header=0), glob.glob('data/*.csv))
aber es gab einen Fehler "parser_f () fehlt 1 erforderliches Positionsargument: 'filepath_or_buffer'"Bearbeiten: Ich habe meinen Weg in https://stackoverflow.com/a/21232849/186078 gegoogelt . In letzter Zeit finde ich es jedoch schneller, Manipulationen mit numpy durchzuführen und sie dann einmal dem Datenrahmen zuzuweisen, anstatt den Datenrahmen selbst iterativ zu manipulieren, und es scheint auch in dieser Lösung zu funktionieren.
Ich möchte aufrichtig, dass jemand, der auf diese Seite trifft, diesen Ansatz in Betracht zieht, aber ich möchte diesen riesigen Code nicht als Kommentar anhängen und ihn weniger lesbar machen.
Sie können numpy nutzen, um die Verkettung von Datenrahmen wirklich zu beschleunigen.
Timing-Statistiken:
quelle
Wenn Sie rekursiv suchen möchten ( Python 3.5 oder höher ), können Sie Folgendes tun:
Beachten Sie, dass die drei letzten Zeilen in einer einzigen Zeile ausgedrückt werden können :
Die Dokumentation finden Sie
**
hier . Auch ich verwendeniglob
stattglob
, da es eine gibt Iterator statt einer Liste.EDIT: Multiplattform rekursive Funktion:
Sie können das oben Genannte in eine Multiplattform-Funktion (Linux, Windows, Mac) einbinden, um Folgendes zu tun:
Hier ist die Funktion:
quelle
Einfach und schnell
Importieren Sie zwei oder mehr Namen
csv
, ohne eine Liste mit Namen erstellen zu müssen.quelle
Ein Liner verwendet
map
, aber wenn Sie zusätzliche Argumente angeben möchten, können Sie Folgendes tun:Hinweis: An
map
sich können Sie keine zusätzlichen Argumente angeben.quelle
Wenn mehrere CSV-Dateien komprimiert sind, können Sie zipfile verwenden, um alle zu lesen und wie folgt zu verketten:
quelle
Ein weiterer Onliner mit Listenverständnis, der die Verwendung von Argumenten mit read_csv ermöglicht.
quelle
Basierend auf der guten Antwort von @ Sid.
Vor dem Verketten können Sie CSV-Dateien in ein Zwischenwörterbuch laden, das den Zugriff auf jeden Datensatz basierend auf dem Dateinamen (im Formular
dict_of_df['filename.csv']
) ermöglicht. Ein solches Wörterbuch kann Ihnen helfen, Probleme mit heterogenen Datenformaten zu identifizieren, wenn beispielsweise Spaltennamen nicht ausgerichtet sind.Importieren Sie Module und suchen Sie Dateipfade:
Hinweis:
OrderedDict
ist nicht erforderlich, behält jedoch die Reihenfolge der Dateien bei, die für die Analyse hilfreich sein können.Laden Sie CSV-Dateien in ein Wörterbuch. Dann verketten:
Schlüssel sind Dateinamen
f
und Werte sind der Datenrahmeninhalt von CSV-Dateien. Anstattf
als Wörterbuchschlüssel zu verwenden, können Sie auchos.path.basename(f)
oder andere os.path- Methoden verwenden, um die Größe des Schlüssels im Wörterbuch nur auf den kleineren Teil zu reduzieren, der relevant ist.quelle
Alternative Nutzung der
pathlib
Bibliothek (oft bevorzugtos.path
).Diese Methode vermeidet die iterative Verwendung von Pandas
concat()
/apped()
.Aus der Pandas-Dokumentation:
Es ist erwähnenswert, dass concat () (und daher append ()) eine vollständige Kopie der Daten erstellt und dass die ständige Wiederverwendung dieser Funktion zu einem erheblichen Leistungseinbruch führen kann. Wenn Sie die Operation für mehrere Datensätze verwenden müssen, verwenden Sie ein Listenverständnis.
quelle
So können Sie Colab in Google Drive verwenden
quelle
quelle