Zauważyłem bardzo słabą wydajność podczas używania iterrows od pand.
Czy jest to coś, czego doświadczają inni? Czy jest to specyficzne dla iterrows i czy należy unikać tej funkcji dla danych o określonym rozmiarze (pracuję z 2-3 milionami wierszy)?
Ta dyskusja na GitHub doprowadziła mnie do przekonania, że jest to spowodowane mieszaniem dtypów w ramce danych, jednak prosty przykład poniżej pokazuje, że istnieje nawet przy użyciu jednego dtype (float64). Na moim komputerze trwa to 36 sekund:
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
Dlaczego wektoryzowane operacje, takie jak stosowane, są znacznie szybsze? Wyobrażam sobie, że musi tam zachodzić pewna iteracja wiersz po wierszu.
Nie mogę wymyślić, jak nie używać iterows w moim przypadku (to zachowam na przyszłe pytanie). Dlatego byłbym wdzięczny za wysłuchanie, gdybyś konsekwentnie był w stanie uniknąć tej iteracji. Obliczenia wykonuję na podstawie danych w oddzielnych ramkach danych. Dziękuję Ci!
--- Edycja: uproszczona wersja tego, co chcę uruchomić, została dodana poniżej ---
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
NIE jest wektoryzowany.iterrows
jest jeszcze gorszy, ponieważ wszystko pakuje (z tym „różnicą perf”apply
). Powinieneś używać tylkoiterrows
w bardzo niewielu sytuacjach. IMHO nigdy. Pokaż, z czym tak naprawdę robisziterrows
.