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
Enregistrer un commentaire