web-dev-qa-db-fra.com

Vérifier que pandas.Series.index contient une valeur

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.

EXEMPLE SIMPLE POUR MONTRER LE BUG

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
9
user3537808

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

10
sacuL

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
0
user25064