2016-07-07 78 views
0

我有14個數據幀,每個數據幀有14列和250,000多行。 數據幀具有相同的列標題,我想按行逐行合併數據幀。我試圖將數據幀連接到「不斷增長的」數據幀,這需要幾個小時。將熊貓數據幀逐行組合的高效方法

從本質上講,我是在做類似下面的13倍:

DF = pd.DataFrame() 
for i in range(13): 
    DF = pd.concat([DF, subDF]) 

的計算器答案here建議附加的所有子數據幀列表,然後連接子數據幀的列表。

這聽起來像是在做這樣的事情:

DF = pd.DataFrame() 
lst = [subDF, subDF, subDF....subDF] #up to 13 times 
for subDF in lst: 
    DF = pd.concat([DF, subDF]) 

他們不是一回事?也許我誤解了建議的工作流程。這是我測試的。

import numpy 
import pandas as pd 
import timeit 

def test1(): 
    "make all subDF and then concatenate them" 
    numpy.random.seed(1) 
    subDF = pd.DataFrame(numpy.random.rand(1)) 
    lst = [subDF, subDF, subDF] 
    DF = pd.DataFrame() 
    for subDF in lst: 
     DF = pd.concat([DF, subDF], axis=0,ignore_index=True) 

def test2(): 
    "add each subDF to the collecitng DF as you're making the subDF" 
    numpy.random.seed(1) 
    DF = pd.DataFrame() 
    for i in range(3): 
     subDF = pd.DataFrame(numpy.random.rand(1)) 
     DF = pd.concat([DF, subDF], axis=0,ignore_index=True) 

print('test1() takes {0} sec'.format(timeit.timeit(test1, number=1000))) 
print('test2() takes {0} sec'.format(timeit.timeit(test2, number=1000))) 

>> Output 

test1() takes 12.732409087137057 sec 
test2() takes 15.097430311612698 sec 

我很感激你的有效途徑建議,串聯多個數據幀逐行。謝謝!

+0

您是否想過通過追加數據將它們放到一個csv中,然後將該csv作爲DF讀取。不應該花幾個小時。 – Merlin

回答

3

用您所有的數據幀列表:

dfs = [] 
for i in range(13): 
    df = ... # However it is that you create your dataframes 
    dfs.append(df) 

然後將它們連接起來一舉:

merged = pd.concat(dfs) # add ignore_index=True if appropriate 

這是不是你的代碼快很多,因爲它創建了整整14 dataframes(您原來的13加merged),而你的代碼創建了26個(你原來的13加13中間合併)。

編輯:

這是您的測試代碼的變體。

import numpy 
import pandas as pd 
import timeit 

def test_gen_time(): 
    """Create three large dataframes, but don't concatenate them""" 
    for i in range(3): 
     df = pd.DataFrame(numpy.random.rand(10**6)) 

def test_sequential_concat(): 
    """Create three large dataframes, concatenate them one by one""" 
    DF = pd.DataFrame() 
    for i in range(3): 
     df = pd.DataFrame(numpy.random.rand(10**6)) 
     DF = pd.concat([DF, df], ignore_index=True) 

def test_batch_concat(): 
    """Create three large dataframes, concatenate them at the end""" 
    dfs = [] 
    for i in range(3): 
     df = pd.DataFrame(numpy.random.rand(10**6)) 
     dfs.append(df) 
    DF = pd.concat(dfs, ignore_index=True) 

print('test_gen_time() takes {0} sec' 
      .format(timeit.timeit(test_gen_time, number=200))) 
print('test_sequential_concat() takes {0} sec' 
      .format(timeit.timeit(test_sequential_concat, number=200))) 
print('test_batch_concat() takes {0} sec' 
      .format(timeit.timeit(test_batch_concat, number=200))) 

輸出:

test_gen_time() takes 10.095820872998956 sec 
test_sequential_concat() takes 17.144756617000894 sec 
test_batch_concat() takes 12.99131180600125 sec 

最大份額對應於生成所述dataframes。批量連接大約需要2.9秒;順序連接需要7秒以上。

+0

偉大的一點。這一半的時間! – sedeh

+0

@sedeh如果這個或任何答案已解決您的問題,請點擊複選標記考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 –