Je suis impressionné par toutes les réponses ici. Ce n'est pas une nouvelle réponse, juste une tentative de résumer les délais de toutes ces méthodes. J'ai considéré le cas d'une série de 25 éléments et supposé le cas général où l'index peut contenir n'importe quelles valeurs et où vous voulez la valeur d'index correspondant à la valeur de recherche qui se trouve vers la fin de la série.
Voici les tests de vitesse sur un Mac Mini 2012 dans Python 3.9.10 avec Pandas version 1.4.0.
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: data = [406400, 203200, 101600, 76100, 50800, 25400, 19050, 12700, 950
...: 0, 6700, 4750, 3350, 2360, 1700, 1180, 850, 600, 425, 300, 212, 150, 1
...: 06, 75, 53, 38]
In [4]: myseries = pd.Series(data, index=range(1,26))
In [5]: assert(myseries[21] == 150)
In [6]: %timeit myseries[myseries == 150].index[0]
179 µs ± 891 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [7]: %timeit myseries[myseries == 150].first_valid_index()
205 µs ± 3.67 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [8]: %timeit myseries.where(myseries == 150).first_valid_index()
597 µs ± 4.03 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [9]: %timeit myseries.index[np.where(myseries == 150)[0][0]]
110 µs ± 872 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [10]: %timeit pd.Series(myseries.index, index=myseries)[150]
125 µs ± 2.56 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [11]: %timeit myseries.index[pd.Index(myseries).get_loc(150)]
49.5 µs ± 814 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [12]: %timeit myseries.index[list(myseries).index(150)]
7.75 µs ± 36.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [13]: %timeit myseries.index[myseries.tolist().index(150)]
2.55 µs ± 27.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [14]: %timeit dict(zip(myseries.values, myseries.index))[150]
9.89 µs ± 79.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [15]: %timeit {v: k for k, v in myseries.items()}[150]
9.99 µs ± 67 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
La réponse de @Jeff semble être la plus rapide - bien qu'elle ne gère pas les doublons.
Correction : Désolé, j'en ai oublié un, la solution de @Alex Spangher utilisant la méthode de l'indice de liste est de loin la plus rapide.
Mise à jour : Ajouté la réponse de @EliadL.
J'espère que cela vous aidera.
Il est étonnant qu'une opération aussi simple nécessite des solutions aussi alambiquées et que beaucoup soient aussi lentes. Plus d'une demi-milliseconde dans certains cas pour trouver une valeur dans une série de 25.
2022-02-18 Mise à jour
Mise à jour de tous les timings avec la dernière version de Pandas et Python 3.9. Même sur un ordinateur plus ancien, tous les temps ont considérablement diminué (10 à 70%) par rapport aux tests précédents (version 0.25.3).
Plus : Ajout de deux méthodes supplémentaires utilisant des dictionnaires.