2016-07-12 11 views
2

対象のディレクトリから複数のCSVファイル(数百のファイル、それぞれ数百の行が同じ列数)を単一のPython Pandas DataFrameに読み込みたいとします。複数のCSVファイルをPythonデータフレームにインポートする処理を高速化

私が書いたコードは遅すぎます.30個のファイルを実行するには数分かかるので、すべてのファイルをロードするとどれくらい待つべきですか?より速く動作させるために何を変更できますか?

さらに、私は "_"(通常のutf-8)に "_" ?私はcoding=latin-1を使用しています。なぜなら、ファイルにフランス語のアクセントがあるからです。

#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

Pythonに到達する前にすべてのファイルを結合することはできますか?そうすれば、1つのファイルだけが読み込まれますか?代わりにファイルをまとめて 'zip'することで、ランダムアクセスが可能になりますが、オペレーティングシステムのファイルキャッシュの利点が得られます。 – chrisaycock

+0

私はPythonに到達する前にどのように連結するか分かりません。すべてのファイルを1つのCSVファイルにするには?とzipのために、どのステップですか? – ch36r5s

+0

はい、大きなCSVファイルを1つ作成するか、または「zip」ファイルを作成してください。これらはPythonとは関係ありません。これをPythonの外部で行う必要があります。すべてのデータを含む1つのファイルを作成したら、Pythonスクリプトにそのファイルを直接読み込ませます。 – chrisaycock

答えて

1

次のことを試してください - 本当に必要な列のみを読んで、使用リストの理解と、それはかなり遅いので、一度pd.concat([ ... ], ignore_index=True)を呼び出す:

# 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 
    ) 

あなたがするのに十分なメモリを持っている場合、これは動作するはずです2つの結果のDF ...

+0

これは 'date_cols'のために働くが、' usecols'については 'ValueError:Usecolsは名前と一致しない'というエラーを返す。 'IndexError:リストのインデックスが範囲外です ' – ch36r5s

+0

' cols'リストに必要な列名を指定する必要があります。エラーメッセージ 'ValueError: Usecolsは名前が一致しません。 – MaxU

関連する問題