2016-07-12 8 views
2

Ich möchte mehrere CSV-Dateien (Hunderte von Dateien, Hunderte von Zeilen jeder, aber mit der gleichen Anzahl von Spalten) aus einem Zielverzeichnis in einem einzigen Python Pandas DataFrame lesen.Beschleunigen Sie den Prozess des Importierens mehrerer CSV in Python Dataframe

Der Code unter ich schrieb funktioniert aber zu langsam.Es dauert Minuten, um 30 Dateien auszuführen (wie lange sollte ich warten, wenn ich alle meine Dateien laden). Was kann ich ändern, damit es schneller funktioniert?

Außerdem, in replace Funktion, ich möchte ein "_" (weiß nicht die Codierung, aber nicht eine normale) zu einem "-" (normale utf-8), wie kann ich damit tun ? Ich benutze coding=latin-1, weil ich französische Akzente in den Dateien habe.

#coding=latin-1 

import pandas as pd 
import glob 

pd.set_option('expand_frame_repr', False) 

path = r'D:\Python27\mypfe\data_test' 
allFiles = glob.glob(path + "/*.csv") 
frame = pd.DataFrame() 
list_ = [] 
for file_ in allFiles: 
    df = pd.read_csv(file_, index_col = None, header = 0, sep = ';', dayfirst = True, 
        parse_dates=['HeurePrevue','HeureDebutTrajet','HeureArriveeSurSite','HeureEffective']) 
    df.drop(labels=['aPaye','MethodePaiement','ArgentPercu'],axis=1,inplace=True) 
    df['Sens'].replace("\n", "-", inplace=True,regex=True) 
    list_.append(df) 

    print "fichier lu:",file_ 

frame = pd.concat(list_) 

print frame 
+0

Können Sie einfach alle Dateien miteinander verketten, bevor Sie jemals zu Python kommen? Auf diese Weise wird nur eine Datei gelesen? Eine Alternative wäre, die Dateien zusammen zu zippen, was Ihnen einen wahlfreien Zugriff mit den Vorteilen des Dateicaches des Betriebssystems ermöglicht. – chrisaycock

+0

Ich verstehe nicht wirklich, wie man verkettet, bevor man zu Python kommt. Um alle Dateien in eine CSV-Datei zu machen? Und für 'zip', in welchem ​​Schritt? – ch36r5s

+0

Ja, erstellen Sie eine große CSV-Datei oder erstellen Sie eine ZIP-Datei. Diese haben nichts mit Python zu tun; Sie müssen dies extern zu Python tun. Sobald Sie eine Datei mit allen Daten haben, lassen Sie Ihr Python-Skript diese Datei direkt lesen. – chrisaycock

Antwort

1

Sie können versuchen, die folgenden - lesen Sie nur die Spalten, die wirklich brauchen, Verstehen Gebrauch Liste und pd.concat([ ... ], ignore_index=True) einmal nennen, weil es ziemlich langsam ist:

# there is no sense to read columns that you don't need 
# specify the column list (EXCLUDING: 'aPaye','MethodePaiement','ArgentPercu') 
cols = ['col1', 'col2', 'etc.'] 
date_cols = ['HeurePrevue','HeureDebutTrajet','HeureArriveeSurSite','HeureEffective'] 

df = pd.concat(
     [pd.read_csv(f, sep = ';', dayfirst = True, usecols=cols, 
        parse_dates=date_cols) 
     for f in allFiles 
     ], 
     ignore_index=True 
    ) 

dies sollte funktionieren, wenn Sie über genügend Speicher speichern zwei resultierende DFs ...

+0

es funktioniert für die 'date_cols', aber wenn es zu' usecols' kommt, gibt es einen Fehler zurück: 'ValueError: Usecols stimmen nicht überein'. Und wenn ich die Nummer der Spalte verwende, gibt es eine Rückmeldung: 'IndexError: Listenindex außerhalb des Bereichs ' – ch36r5s

+0

Nun, Sie müssen die Spaltennamen angeben, die Sie in der' cols'-Liste brauchen - ich denke die Fehlermeldung 'ValueError: Usecols stimmen nicht mit Namen überein "ist ziemlich selbsterklärend ... – MaxU