Pandaların yinelemelerini kullanırken çok düşük performans fark ettim.
Bu başkaları tarafından deneyimlenen bir şey mi? Yinelemelere özel mi ve belirli bir boyuttaki veriler için bu işlevden kaçınılmalı mı (2-3 milyon satırla çalışıyorum)?
GitHub'daki bu tartışma , bunun veri çerçevesindeki dtype'ları karıştırırken ortaya çıktığına inanmamı sağladı, ancak aşağıdaki basit örnek, bir dtype (float64) kullanırken bile orada olduğunu gösteriyor. Bu, makinemde 36 saniye sürüyor:
import pandas as pd
import numpy as np
import time
s1 = np.random.randn(2000000)
s2 = np.random.randn(2000000)
dfa = pd.DataFrame({'s1': s1, 's2': s2})
start = time.time()
i=0
for rowindex, row in dfa.iterrows():
i+=1
end = time.time()
print end - start
Vektörize edilmiş işlemler neden bu kadar hızlı uygulanır? Orada da bir dizi satır yineleme olduğunu hayal ediyorum.
Benim durumumda yinelemeleri nasıl kullanmayacağımı çözemiyorum (bu, gelecekteki bir soru için saklayacağım). Bu nedenle, bu yinelemeden sürekli olarak kaçınabildiyseniz, duymaktan memnun olurum. Ayrı veri çerçevelerindeki verilere dayalı hesaplamalar yapıyorum. Teşekkür ederim!
--- Düzenleme: çalıştırmak istediğim şeyin basitleştirilmiş versiyonu aşağıya eklendi ---
import pandas as pd
import numpy as np
#%% Create the original tables
t1 = {'letter':['a','b'],
'number1':[50,-10]}
t2 = {'letter':['a','a','b','b'],
'number2':[0.2,0.5,0.1,0.4]}
table1 = pd.DataFrame(t1)
table2 = pd.DataFrame(t2)
#%% Create the body of the new table
table3 = pd.DataFrame(np.nan, columns=['letter','number2'], index=[0])
#%% Iterate through filtering relevant data, optimizing, returning info
for row_index, row in table1.iterrows():
t2info = table2[table2.letter == row['letter']].reset_index()
table3.ix[row_index,] = optimize(t2info,row['number1'])
#%% Define optimization
def optimize(t2info, t1info):
calculation = []
for index, r in t2info.iterrows():
calculation.append(r['number2']*t1info)
maxrow = calculation.index(max(calculation))
return t2info.ix[maxrow]
apply
Vektörize DEĞİLDİR.iterrows
daha da kötüdür, çünkü her şeyi kutuya alır (bu 'performans farkı ileapply
). Sadeceiterrows
çok az durumda kullanmalısınız. IMHO asla. Gerçekte ne yaptığınızı gösteriniterrows
.