J'ai remarqué de très mauvaises performances lors de l'utilisation d'iterrows de pandas.
Est-ce quelque chose que les autres vivent? Est-ce spécifique à iterrows et cette fonction doit-elle être évitée pour les données d'une certaine taille (je travaille avec 2-3 millions de lignes)?
Cette discussion sur GitHub m'a amené à croire que cela est causé lors du mélange de dtypes dans le dataframe, mais l'exemple simple ci-dessous montre qu'il existe même lorsque vous utilisez 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 les opérations vectorisées comme s'appliquent-elles tellement plus rapidement? J'imagine qu'il doit y avoir une itération ligne par ligne là aussi.
Je ne peux pas comprendre comment ne pas utiliser iterrows dans mon cas (je vais le garder pour une question future). Par conséquent, j'apprécierais de savoir si vous avez toujours pu éviter cette itération. Je fais des calculs basés sur des données dans des dataframes séparés. Je vous remercie!
--- Edit: une version simplifiée de ce que je veux exécuter a été ajoutée ci-dessous ---
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
c'est encore pire car il boxe tout (avec qui 'la perf diffèreapply
). Vous ne devriez l'utiliser queiterrows
dans très très peu de situations. IMHO jamais. Montrez ce que vous faites réellementiterrows
.