Tut pandas iterrows haben performance Probleme?

Habe ich bemerkt, eine sehr schlechte Leistung bei Verwendung von iterrows von pandas.

Ist das etwas, was von anderen erfahren? Ist es spezifisch für iterrows und sollte diese Funktion erspart werden, Daten von einer bestimmten Größe (ich arbeite mit 2-3 Millionen Zeilen)?

Diese Diskussion auf GitHub führte mich zu glauben, es wird verursacht, wenn das mischen dtypes in der dataframe, jedoch das einfache Beispiel unten zeigt, ist es auch bei Verwendung eines dtype (float64). Dies dauert 36 Sekunden auf meiner Maschine:

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 sind vektorisierte Operationen wie bewerben so viel schneller? Ich vorstellen, es müssen einige Zeilen-iteration geht es auch.

Ich kann nicht herausfinden, wie man nicht verwenden, iterrows in meinem Fall (das werde ich sparen für eine Zukunft in Frage). Von daher würde ich schätzen, hören, wenn Sie konsequent in der Lage zu vermeiden, diese iteration. Ich mache Berechnungen basieren auf den Daten, die in separaten dataframes. Danke!

---Edit: eine vereinfachte version von dem, was ich ausführen will, wurde Hinzugefügt, unten---

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 ist NICHT vektorisiert. iterrows ist umso schlimmer, als es Boxen alles (dass' das perf diff mit apply). Sie sollten nur verwendet werden iterrows in sehr sehr wenigen Situationen. IMHO nie. Zeigen Sie, was Sie tatsächlich tun, mit iterrows.
  • Das Problem, das Sie verknüpft, anstatt zu tun hat mit den Boxen von einem DatetimeIndex in Timestamps (implementiert in python-Platz), und dies wurde viel verbessert im master.
  • Siehe dieses Thema für eine Diskussion: github.com/pydata/pandas/issues/7194.
  • Link zu der betreffenden Frage (diese bleiben allgemein): stackoverflow.com/questions/24875096/...
  • Bitte empfehlen nicht die Verwendung von iterrows(). Es ist eine himmelschreiende enabler der schlimmsten anti-pattern in der Geschichte der pandas.
InformationsquelleAutor KieranPC | 2014-07-21
Schreibe einen Kommentar