2016-04-01 3 views
0

Мне нужно добавить DataFrame (50 строк) в другую (ту же структуру) каждую итерацию, у меня есть цикл с итерацией 10000, для создания окончательного DataFrame требуется около 10 минут.Pandas Dataframes append

out = pd.DataFrame() 
tmp = res.copy() #my initial DataFrame with 50 rows 

for nb in range(1,10001) : 
    ... 
    ... 
    #some code here to 
    match = (res.COL06 == 'PCE') 
    tmp['COL06'] = np.where(match,res["CLE"].map(lambda x : x.ljust(12-len(str(nb)),'0')) + str(nb),res["COL06"]) 
    ... 

    out = pd.concat([out,tmp],ignore_index='True',axis=0) 

Есть ли другой способ сделать это?

+0

Я не знаю, проводите ли вы большую часть своего времени в функции 'concat', но вы можете попробовать' out = out.append (tmp, ignore_index = True) ' – cncggvg

+0

У меня такой же результат с append :( – slimoo

ответ

0

Похоже, что операция конкатенации не является вашим настоящим узким местом. С помощью вашего метода я объединил 10 000 DataFrames с 50 строками каждый примерно за 22 секунды. Поэтому, если не происходит какой-то забавный материал, или ваши DataFrames очень широкие (я использовал только 1 столбец), лучшим вариантом может быть профилирование вашего кода (используя, например, pdb), и найдите часть, которая действительно потребляет большинство ресурсов (что всегда должен быть вашим первым шагом при выполнении проблем с производительностью).

Однако, если вы уверены, что ваши конкатенации значительно замедляет вас, вы можете сначала написать все tmp DataFrames в список Python и сцепить их все сразу после цикла:

import pandas as pd 

def append1(n): # your method 
    out = pd.DataFrame() 
    for nb in range(n): 
     tmp = pd.DataFrame({"val": range(nb,50+nb)}) 
     out = pd.concat([out,tmp],ignore_index='True',axis=0) 
    return out 

def append2(n): # concatenate after loop 
    out = pd.DataFrame() 
    tmp_list = [] 
    for nb in range(n): 
     tmp = pd.DataFrame({"val": range(nb,50+nb)}) 
     tmp_list.append(tmp) 
    out = pd.concat(tmp_list,ignore_index='True',axis=0) 
    return out 
воздействие

Производительность:

%timeit append1(10000) 

1 цикл, лучшие из 3: 22,4 с на петле

%timeit append2(10000) 

1 петля, лучшая из 3: 4.15 с за петлю

+0

У меня есть dataframes с 55 столбцами !! – slimoo

+0

Хорошо, в этом случае 10 минут могут быть реалистичными. Вы попробовали мои предлагаемые изменения? По крайней мере, пусть ваш код будет работать в пять раз быстрее. – Dion

Смежные вопросы