2017-03-16 2 views
7

テキストファイルを読んで、マルチインデックスDataFrameを作成します。マルチインデックスを作成し、テキストファイルからデータをdf.loc[[],[]]で割り当てるか、DataFrameに行を連結し、最後にDataFrameのインデックスを設定する方が速いのですか?または、リストまたはdictを使用してファイルから読み取ったデータを保存してから、DataFrameを作成する方が速いのですか?より多くのpythonicまたは高速オプションがありますか?テキストファイルからデータを読み込み、それをデータフレームに割り当てる最も速い方法は何ですか?

例テキストファイル:

A = 1 
B = 1 
    C data 
    0 1 
    1 2 
A = 1 
B = 2 
    C data 
    1 3 
    2 4 
A = 2 
B = 1 
    C data 
    0 5 
    2 6 

出力DATAFRAME:

A B C data 
1 1 0 1 
    1 2 
1 2 1 3 
    2 4 
2 1 0 5 
    2 6 

更新1月18日:これはHow to parse complex text files using Python?にリンクされているが、私はまたblog article explaining how to parse complex files to beginnersを書きました。

+0

おそらく、あなたは['timeit'](https://docs.python.org/3/library/timeit.html)モジュールを使ってテストすることができます。 –

+0

テキストファイルのサイズはどれくらいですか? –

+0

@MartinEvans 100 MBのオーダー – bluprince13

答えて

8

pandasの要素検索は高価な操作であり、インデックスによる並べ替えもそうです。すべてを配列に読み込み、値のDataFrameを作成し、階層インデックスを直接設定します。通常、追加や参照を避けることができれば、はるかに高速です。テキストファイルが処理オーバーヘッドの大部分になります解析

In [106]: dataset 
Out[106]: 
array([[1, 1, 0, 1], 
     [1, 1, 1, 2], 
     [1, 2, 1, 3], 
     [1, 2, 2, 4], 
     [2, 1, 0, 5], 
     [2, 1, 2, 6]]) 

In [107]: pd.DataFrame(dataset,columns=['A','B','C', 'data']).set_index(['A', 'B', 'C']) 
    ...: 
Out[107]: 
     data 
A B C  
1 1 0  1 
    1  2 
    2 1  3 
    2  4 
2 1 0  5 
    2  6 

In [108]: data_values = dataset[:, 3] 
    ...: data_index = pd.MultiIndex.from_arrays(dataset[:,:3].T, names=list('ABC')) 
    ...: pd.DataFrame(data_values, columns=['data'], index=data_index) 
    ...: 
Out[108]: 
     data 
A B C  
1 1 0  1 
    1  2 
    2 1  3 
    2  4 
2 1 0  5 
    2  6 

In [109]: %timeit pd.DataFrame(dataset,columns=['A','B','C', 'data']).set_index(['A', 'B', 'C']) 
%%timeit 
1000 loops, best of 3: 1.75 ms per loop 

In [110]: %%timeit 
    ...: data_values = dataset[:, 3] 
    ...: data_index = pd.MultiIndex.from_arrays(dataset[:,:3].T, names=list('ABC')) 
    ...: pd.DataFrame(data_values, columns=['data'], index=data_index) 
    ...: 
1000 loops, best of 3: 642 µs per loop 
5

:ここ

は、あなたがに集中すべてとデータセット2次元配列を持っていると仮定したサンプルの結果です。

スピードが主な懸念事項である場合、私はpickleまたはshelveを使用してDataFrameオブジェクトをバイナリファイルに保存して使用することをお勧めします。

何らかの理由でテキストファイルを使用する必要がある場合は、フォーマット間の変換用に別のモジュールを作成することができます。

関連する問題