Ho notato prestazioni molto scarse durante l'utilizzo di iterrows da panda.Il problema ha problemi di prestazioni?
È qualcosa che viene sperimentato da altri? È specifico per iterrows e questa funzione dovrebbe essere evitata per i dati di una certa dimensione (sto lavorando con 2-3 milioni di righe)?
This discussion su GitHub mi ha portato a credere che sia causato quando si mischiano i dtypes nel dataframe, tuttavia il semplice esempio qui sotto mostra che c'è anche quando si usa un dtype (float64). Questa operazione richiede 36 secondi sulla mia macchina:
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
Perché le operazioni vettoriali sono applicate in modo molto più rapido? Immagino che ci debba essere qualche iterazione riga per riga anche lì.
Non riesco a capire come non usare iterrows nel mio caso (questo salverò per una domanda futura). Pertanto mi piacerebbe sentire se tu fossi stato in grado di evitare questa iterazione. Sto facendo calcoli basati su dati in datafram separati. Grazie!
--- Edit: semplificata versione di ciò che voglio correre è stato aggiunto al di sotto ---
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'' NON è vettorizzato. '' iterrows'' è ancora peggio dato che racchiude tutto (cio 'il diff diff con '' apply''). Dovresti usare solo '' iterrows'' in pochissime situazioni. IMHO mai. Mostra ciò che stai facendo con '' iterrows''. – Jeff
Il problema a cui ci si è collegati invece ha a che fare con la boxe di un '' DatetimeIndex'' in '' Timestamp'' (è stato implementato in python space), e questo è stato molto migliorato in master. – Jeff
Vedere questo problema per una discussione più completa: https://github.com/pydata/pandas/issues/7194. – Jeff