777 Stimmen

Importiere mehrere CSV-Dateien in Pandas und füge sie zu einem DataFrame zusammen

Ich möchte mehrere CSV-Dateien aus einem Verzeichnis in Pandas einlesen und zu einem großen DataFrame zusammenfügen. Bisher habe ich es jedoch nicht geschafft, es herauszufinden. Hier ist, was ich bisher habe:

import glob
import pandas as pd

# Dateinamen abrufen
path = r'C:\DRO\DCL_rawdata_files'
filenames = glob.glob(path + "/*.csv")

dfs = []
for filename in filenames:
    dfs.append(pd.read_csv(filename))

# Alle Daten zu einem DataFrame zusammenführen
big_frame = pd.concat(dfs, ignore_index=True)

Ich denke, ich brauche Hilfe innerhalb der for-Schleife?

900voto

Gaurav Singh Punkte 11011

Siehe Pandas: IO-Tools für alle verfügbaren .read_-Methoden.

Versuchen Sie den folgenden Code, wenn alle CSV-Dateien die gleichen Spalten haben.

Ich habe header=0 hinzugefügt, damit nach dem Lesen der ersten Zeile der CSV-Datei diese als Spaltennamen zugewiesen werden kann.

import pandas as pd
import glob
import os

path = r'C:\DRO\DCL_rawdata_files' # verwenden Sie Ihren Pfad
all_files = glob.glob(os.path.join(path , "/*.csv"))

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)

Oder, mit Verweis auf einen Kommentar von Sid.

all_files = glob.glob(os.path.join(path, "*.csv"))

df = pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)

  • Es ist oft notwendig, jede Datenprobe zu identifizieren, was durch Hinzufügen einer neuen Spalte zum DataFrame erreicht werden kann.
  • pathlib aus der Standardbibliothek wird für dieses Beispiel verwendet. Es behandelt Pfade als Objekte mit Methoden, anstatt als zu zerlegende Zeichenfolgen.

Imports und Einrichtung

from pathlib import Path
import pandas as pd
import numpy as np

path = r'C:\DRO\DCL_rawdata_files'  # oder Unix/Linux/Mac-Pfad

# Holen Sie die Dateien aus dem im OP angegebenen Pfad
files = Path(path).glob('*.csv')  # .rglob um Unterverzeichnisse zu erhalten

Option 1:

  • Fügen Sie eine neue Spalte mit dem Dateinamen hinzu

    dfs = list() for f in files: data = pd.read_csv(f)

    .stem ist eine Methode für Pathlib-Objekte, um den Dateinamen ohne Erweiterung zu erhalten

    data['file'] = f.stem
    dfs.append(data)

    df = pd.concat(dfs, ignore_index=True)

Option 2:

  • Fügen Sie eine neue Spalte mit einem generischen Namen unter Verwendung von enumerate hinzu

    dfs = list() for i, f in enumerate(files): data = pd.read_csv(f) data['file'] = f'Datei {i}' dfs.append(data)

    df = pd.concat(dfs, ignore_index=True)

Option 3:

  • Erstellen Sie die DataFrames mit einer Listenabstraktion und verwenden Sie dann np.repeat, um eine neue Spalte hinzuzufügen.
    • [f'S{i}' for i in range(len(dfs))] erstellt eine Liste von Zeichenfolgen, um jedes DataFrame zu benennen.
    • [len(df) for df in dfs] erstellt eine Liste von Längen
  • Die Anerkennung für diese Option geht an diese Plotting-Antwort.

    Lesen Sie die Dateien in DataFrames ein

    dfs = [pd.read_csv(f) for f in files]

    Kombinieren Sie die Liste der DataFrames

    df = pd.concat(dfs, ignore_index=True)

    Fügen Sie eine neue Spalte hinzu

    df['Quelle'] = np.repeat([f'S{i}' for i in range(len(dfs))], [len(df) for df in dfs])

Option 4:

  • Einzelformulierungen mit .assign zur Erstellung der neuen Spalte, mit Anerkennung für einen Kommentar von C8H10N4O2

    df = pd.concat((pd.read_csv(f).assign(filename=f.stem) for f in files), ignore_index=True)

oder

df = pd.concat((pd.read_csv(f).assign(Quelle=f'S{i}') for i, f in enumerate(files)), ignore_index=True)

370voto

Sid Punkte 5422

Ein Alternativvorschlag zu darindaCoder's Antwort:

path = r'C:\DRO\DCL_rawdata_files'                     # verwende deinen Pfad
all_files = glob.glob(os.path.join(path, "*.csv"))     # es ist ratsam os.path.join zu verwenden, da dies die Verkettung unabhängig vom Betriebssystem macht

df_from_each_file = (pd.read_csv(f) for f in all_files)
concatenated_df   = pd.concat(df_from_each_file, ignore_index=True)
# erstellt keine Liste und fügt nicht zu einer hinzu

123voto

import glob
import os
import import pandas as pd   
df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "meine_dateien*.csv")))

99voto

robmsmt Punkte 1182

Fast alle Antworten hier sind entweder unnötig komplex (Glob-Musterabgleich) oder verwenden zusätzliche Drittanbieter-Bibliotheken. Sie können dies in zwei Zeilen erledigen, indem Sie alles verwenden, was Pandas und Python (alle Versionen) bereits integriert haben.

Für ein paar Dateien - Einzeiler

df = pd.concat(map(pd.read_csv, ['d1.csv', 'd2.csv','d3.csv']))

Für viele Dateien

import os

filepaths = [f for f in os.listdir(".") if f.endswith('.csv')]
df = pd.concat(map(pd.read_csv, filepaths))

Für keine Überschriften

Wenn Sie spezifische Dinge ändern möchten, beispielsweise keine Überschriften bei pd.read_csv, können Sie eine separate Funktion erstellen und diese mit Ihrem map aufrufen:

def f(i):
    return pd.read_csv(i, header=None)

df = pd.concat(map(f, filepaths))

Diese Pandas-Zeile, die das df setzt, nutzt drei Dinge:

  1. Python's map (function, iterable) sendet die Funktion (die pd.read_csv()) das Iterable (unsere Liste), das jedes CSV-Element in filepaths ist.
  2. Die Panda read_csv()-Funktion liest jede CSV-Datei normal ein.
  3. Die Panda concat()-Funktion fasst all dies unter einer df-Variablen zusammen.

88voto

MrFun Punkte 2213

Einfach und schnell

Importieren Sie zwei oder mehr CSV-Dateien, ohne eine Liste von Namen erstellen zu müssen.

import glob
import pandas as pd

df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv')))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X