Soustraction rapide de deux dataframes en ignorant les indices (Python)

How do I subtract 2 dataframes ignoring indices, in the fastest way possible.

Par exemple, je veux soustraire:

d1=
x1
0 -3.141593
0 -3.141593
0 -3.141593
1 -2.443461
1 -2.443461

depuis

d2 = 
x2
1 -2.443461
2 -1.745329
3 -1.047198
4 -0.349066
2 0.349066

Ce que j'ai essayé:

Je peux le faire comme ça, par exemple:

dsub = d1.reset_index(drop=True) - d2.reset_index(drop=True)

Cependant, je veux faire la soustraction de la manière la plus efficace possible. J'ai cherché une réponse, mais je n'ai vu que des solutions qui ne tiennent pas compte de la vitesse.

Comment puis-je accomplir cela?

EDIT Sur la base de certaines réponses, voici quelques fois en exécutant sur ma machine :

Pour les dataframes plus petits :

Méthode 1 (a et b):

a: d1.reset_index(drop=True) - d2.reset_index(drop=True)
b: d1.reset_index(drop=True).sub(d2.reset_index(drop=True))
~1024.91 usec/pass

Méthode 2 :

d1 - d2.values
~784.79 usec/pass

Méthode 3:

pd.DataFrame(d1.values - d2.values, d1.index, ['x1-x2'])
~653.82 usec/pass

Pour les très grandes trames de données, veuillez consulter la réponse de @ MaxU ci-dessous.


Solution du problème

vous pouvez le faire de cette façon:

d1 - d2.values

ou alors:

d1.x1 - d2.x2.values

Démo :

In [172]: d1 - d2.values
Out[172]:
x1
0 -0.698132
0 -1.396264
0 -2.094395
1 -2.094395
1 -2.792527
In [173]: d1.x1 - d2.x2.values
Out[173]:
0 -0.698132
0 -1.396264
0 -2.094395
1 -2.094395
1 -2.792527
Name: x1, dtype: float64

Timing pour les plus grands DF :

In [180]: d1 = pd.concat([d1] * 10**5, ignore_index=True)
In [181]: d2 = pd.concat([d2] * 10**5, ignore_index=True)
In [182]: d1.shape
Out[182]: (500000, 1)
In [183]: %timeit pd.DataFrame(d1.values - d2.values, d1.index, ['x1-x2'])
100 loops, best of 3: 4.07 ms per loop
In [184]: %timeit d1 - d2.values
100 loops, best of 3: 3.99 ms per loop
In [185]: d1 = pd.concat([d1] * 10, ignore_index=True)
In [186]: d2 = pd.concat([d2] * 10, ignore_index=True)
In [187]: d1.shape
Out[187]: (5000000, 1)
In [188]: %timeit pd.DataFrame(d1.values - d2.values, d1.index, ['x1-x2'])
10 loops, best of 3: 19.9 ms per loop
In [189]: %timeit d1 - d2.values
100 loops, best of 3: 14 ms per loop
In [190]: %timeit d1.reset_index(drop=True) - d2.reset_index(drop=True)
1 loop, best of 3: 242 ms per loop
In [191]: %timeit d1.reset_index(drop=True).sub(d2.reset_index(drop=True))
1 loop, best of 3: 242 ms per loop

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"