Je pense (je pense) savoir comment vérifier si une valeur est contenue dans l'index d'une série de pandas, mais je ne peux pas la faire fonctionner dans l'exemple ci-dessous. Est-ce un bug peut-être?
Tout d'abord, je génère des nombres aléatoires:
import numpy as np
import pandas as pd
some_numbers = np.random.randint(0,4,size=10)
print(some_numbers)
Sortie:
[0 2 2 3 1 1 2 2 3 2]
Ensuite, je crée une série avec ces nombres et calcule leur fréquence
s = pd.Series(some_numbers)
gb = s.groupby(s).size() / len(s)
print(gb)
Sortie:
0 0.1
1 0.2
2 0.5
3 0.2
dtype: float64
Jusqu'ici tout va bien. Mais je ne comprends pas le résultat de la prochaine ligne de code:
1.3 in gb
Sortie:
True
Le résultat ne devrait-il pas être False? (J'ai des pandas 0.20.3 sur Python 3.6.2)
Je sais que je pourrais utiliser
1.3 in list(gb.index)
mais ce n'est pas très efficace si la série est grande.
import pandas as pd
s = pd.Series([.1,.2,.3])
print(s)
0 0.1
1 0.2
2 0.3
dtype: float64
3.4 in s
False
mais attendez ...
s = pd.Series([.1,.2,.3,.4])
print(s)
0 0.1
1 0.2
2 0.3
3 0.4
dtype: float64
3.4 in s
True
Je crois que le problème est que gb.index
est un index int64
:
>>> gb.index
Int64Index([0, 1, 2, 3], dtype='int64')
>>> type(gb.index)
<class 'pandas.core.indexes.numeric.Int64Index'>
et donc lors de votre comparaison avec 1.3
, cette valeur est convertie en int. Certaines preuves en sont que les valeurs jusqu’à 3.99999
renverront True
, car la conversion de celle-ci en int
vous donne 3
, cependant, 4.000001 in gb.index
renvoie False
car la conversion de 4.000001
en int
renvoie 4
(qui n’est pas dans gb.index
).
Si vous le forcez sur un index float, vous obtenez false, car 1.3
n'est pas dans Float64Index([0.0, 1.0, 2.0, 3.0], dtype='float64')
:
>>> 1.3 in gb.index.astype('float')
False
testé dans pandas '0.21.1'
, python 3.6.3
Utilisez la propriété values
. Je pense que vous avez trouvé un bug. Cela devrait probablement être soumis sur github.
1.3 in gb.index.values