Ich habe eine sehr schlechte Leistung bei der Verwendung von Iterrows von Pandas festgestellt.
Ist das etwas, was andere erleben? Ist es spezifisch für Iterrows und sollte diese Funktion für Daten einer bestimmten Größe vermieden werden (ich arbeite mit 2-3 Millionen Zeilen)?
Diese Diskussion auf GitHub hat mich zu der Annahme geführt, dass dies beim Mischen von dtypes im Datenrahmen verursacht wird. Das einfache Beispiel unten zeigt jedoch, dass es auch bei Verwendung eines dtype (float64) vorhanden ist. Dies dauert auf meinem Computer 36 Sekunden:
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
Warum lassen sich vektorisierte Operationen wie so viel schneller anwenden? Ich stelle mir vor, dass dort auch eine zeilenweise Iteration stattfinden muss.
Ich kann nicht herausfinden, wie ich in meinem Fall keine Iterrows verwenden soll (dies werde ich für eine zukünftige Frage speichern). Daher würde ich mich freuen, wenn Sie diese Iteration konsequent vermeiden konnten. Ich mache Berechnungen basierend auf Daten in separaten Datenrahmen. Danke dir!
--- Bearbeiten: Eine vereinfachte Version von dem, was ich ausführen möchte, wurde unten hinzugefügt ---
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]
DatetimeIndex
In zu tun Timestamps
(wurde im Python-Bereich implementiert), und dies wurde im Master erheblich verbessert.
apply
wird NICHT vektorisiert.iterrows
ist noch schlimmer, da es alles einpackt (mit dem sich die Leistung unterscheidetapply
). Sie sollten nuriterrows
in sehr wenigen Situationen verwenden. IMHO nie. Zeigen Sie, womit Sie tatsächlich arbeiteniterrows
.