Ne pandas iterrows ont des problèmes de performances?

J'ai remarqué de très mauvaises performances lors de l'utilisation de iterrows de pandas.

Est-ce quelque chose qui est vécu par les autres? Est-il spécifique à iterrows et si cette fonction a éviter pour les données d'une certaine taille (je travaille avec 2 à 3 millions de lignes)?

Cette discussion sur GitHub m'a amené à croire qu'il est causé lorsque le mélange dtypes dans le dataframe, cependant l'exemple simple ci-dessous montre qu'il est là, même lors de l'utilisation d'un dtype (float64). Cela prend 36 secondes sur ma machine:

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

Pourquoi vectorisé opérations d'appliquer de manière beaucoup plus rapide? J'imagine qu'il doit y avoir une certaine ligne par ligne itération y passe aussi.

Je ne peux pas comprendre comment l'utilisez pas iterrows dans mon cas (ce que je vais économiser pour l'avenir d'une question). Donc j'aimerais connaître si vous avez toujours été en mesure d'éviter cette itération. Je suis en train de faire des calculs basés sur des données distinctes dataframes. Merci!!!!

---Edit: version simplifiée de ce que je veux exécuter a été ajouté en dessous de---

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 n'est PAS vectorisé. iterrows est encore pire car elle boîtes tout (que' la diff de perf avec apply). Vous devez uniquement utiliser iterrows dans très très peu de situations. À mon humble avis ne jamais. Montrez ce que vous êtes en train de faire avec iterrows.
  • Le problème est lié à au lieu de cela a à voir avec la boxe de DatetimeIndex en Timestamps (a été mis en œuvre dans l'espace python), et cela a été beaucoup améliorée en maître.
  • Voir ce problème pour une discussion complète sur le sujet: github.com/pydata/pandas/issues/7194.
  • Lien à la question spécifique (celui-ci restera général): stackoverflow.com/questions/24875096/...
  • s'il vous Plaît ne recommande pas l'utilisation de iterrows(). C'est un flagrant enabler des pires anti-modèle dans l'histoire de pandas.
InformationsquelleAutor KieranPC | 2014-07-21