2017-03-16 56 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 

輸出數據幀:

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

逐個元素查找在大熊貓是昂貴的操作,所以是由索引對準。我會將所有內容讀入數組,創建一個值的DataFrame,然後直接設置分層索引。通常,如果你可以避免追加或查找,速度會更快。

下面是一個簡單的結果假設你有一切的數據集2-d陣列中的集中:

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

解析文本文件將是你的處理開銷的大頭。

如果速度是主要關注的問題我建議使用鹹菜或擱置的數據框對象存儲在一個二進制文件即可使用。

如果您需要使用文本文件以任何理由,一個單獨的模塊,可以用於格式之間進行轉換寫入。

相關問題