Pandas iterrows a-t-il des problèmes de performances ?

| | | | | | | |

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

Est-ce quelque chose qui est vécu par d'autres ? Est-ce spécifique à iterrows et faut-il éviter cette fonction pour des 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 dû au mélange de dtypes dans la trame de données, mais l'exemple simple ci-dessous montre qu'il est là même lors de l'utilisation d'un dtype (float64). 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 apply sont-elles tellement plus rapides ? J'imagine qu'il doit y avoir une itération ligne par ligne également.

Je n'arrive pas à comprendre comment pour ne pas utiliser iterrows dans mon cas (ce que je vais garder pour une future question). Par conséquent, j'apprécierais savoir si vous avez toujours été en mesure d'éviter cette itération. Je fais des calculs basés sur des données dans des dataframes séparés. Merci !

---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 #%% Créer les tables d'origine 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) #%% Créer le corps de la nouvelle table table3 = pd.DataFrame(np.nan, columns=["letter","number2"], index=[0]) #%% Itérer en filtrant les données pertinentes, en optimisant, en retournant info pour row_index, ligne dans table1.iterrows() : t2info = table2[table2.letter == row["lettre"]].reset_index() table3.ix[row_index,] = optimiser(t2info,row["number1"] ) #%% Définir l'optimisation def optimiser(t2info, t1info) : calcul = [] pour l'index, r dans t2info.iterrows() : calcul.append(r["nombre2"]*t1info) maxrow = calcul.index(max( calcul)) renvoie t2info.ix[maxrow] 

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers

News


Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method