2016-10-03 4 views
0

Mein DataFrame hat eine Index SubjectID und jede Subject ID hat ein eigenes Verzeichnis. In jedem Subject-Verzeichnis befindet sich eine .csv-Datei mit Informationen, die ich in meinen Dataframe einfügen möchte. Mit meinem SubjectID-Index möchte ich den Header der CSV-Datei für jedes Subjekt einlesen und in eine neue Spalte in meinem DataFrame einfügen.Lesen mehrerer CSV-Dateien aus verschiedenen Verzeichnissen in Pandas DataFrame

Jedes Fachverzeichnis hat denselben Pfad mit Ausnahme der einzelnen Betreff-Nummer.

Ich habe Wege gefunden, mehrere .csv-Dateien aus einem einzigen Zielverzeichnis in einen Pandas DataFrame zu lesen, aber nicht aus mehreren Verzeichnissen. Hier ist ein Code Ich habe für mehrere CSV-Dateien von einem Zielverzeichnis zu importieren:

subject_path = ('/home/mydirectory/SubjectID/') 
filelist = [] 
os.chdir('subject_path') 
for files in glob.glob("*.csv") : 
    filelist.append(files) 

# read each csv file into single dataframe and add a filename reference column 
df = pd.DataFrame() 
columns = range(1,100) 
for c, f in enumerate(filelist) : 
    key = "file%i" % c 
    frame = pd.read_csv((subject_path + f), skiprows = 1, index_col=0, names=columns) 
    frame['key'] = key 
    df = df.append(frame,ignore_index=True) 

ich etwas Ähnliches tun wollen, sondern iterativ gehen in die verschiedenen Fach Verzeichnisse anstelle eines einzelnen Zielverzeichnis mit.

Edit: Ich glaube, ich will diese os nicht pandas tun, besteht darin, es eine Möglichkeit, um eine Schleife zu verwenden, um durch mehrere Verzeichnisse suchen os verwenden?

+0

Der obige Code ist, was ich versucht habe, für den Import von CSV aus einem einzigen Verzeichnis, und das Problem ist, dass ich nicht Sicher, wie Sie dies anpassen, um Dateien aus mehreren Verzeichnissen zu importieren. – MScar

+0

Verwenden Sie vielleicht eine Schleife und suchen Sie mehr als einen Themenpfad? –

+0

Würde ich das mit 'os' machen wollen? Es sieht nicht so aus, als könnte dies in Pandas erreicht werden. – MScar

Antwort

0

Angenommen, Ihre Betreff-Ordner sind in mydirectory, Sie können nur eine Liste aller Ordner im Verzeichnis erstellen und fügen Sie dann die CSVs in Ihre Dateiliste.

import os 

parent_dir = '/home/mydirectory' 
subject_dirs = [os.path.join(parent_dir, dir) for dir in os.listdir(parent_dir) if os.path.isdir(os.path.join(parent_dir, dir))] 

filelist = [] 
for dir in subject_dirs: 
    csv_files = [os.path.join(dir, csv) for csv in os.listdir(dir) if os.path.isfile(os.path.join(dir, csv)) and csv.endswith('.csv')] 
    for file in csv_files: 
     filelist.append(file) 

# Do what you did with the dataframe from here 
... 
0

Betrachten wir die rekursive Methode der os.walk() alle Verzeichnisse und Dateientop-down (default = TRUE) oder von unten nach oben zu lesen. Darüber hinaus können Sie regex verwenden, um Namen zu überprüfen, die speziell für CSV-Dateien gefiltert werden.

Im Folgenden werden ALLE CSV-Dateien in einem beliebigen Kind/Enkel-Ordner aus dem Zielstamm /home/mydirectory importiert. Also, seien Sie sicher, zu überprüfen, ob nicht unterworfenen csv-Dateien existieren, sonst einstellen re.match() entsprechend:

import os, re 
import pandas as pd 

# CURRENT DIRECTORY (PLACE SCRIPT IN /home/mydirectory) 
cd = os.path.dirname(os.path.abspath(__file__)) 

i = 0 
columns = range(1,100) 
dfList = [] 

for root, dirs, files in os.walk(cd): 
    for fname in files: 
     if re.match("^.*.csv$", fname): 
      frame = pd.read_csv(os.path.join(root, fname), skiprows = 1, 
           index_col=0, names=columns) 
      frame['key'] = "file{}".format(i) 
      dfList.append(frame)  
      i += 1 

df = pd.concat(dfList) 
Verwandte Themen