5
votes

Obtenir l'index des séries où la valeur est True

Comment sélectionner uniquement les valeurs True?

myseries.where(myseries == True)

Ce que j'ai essayé:

myindex=['a', 'b', 'c' , 'd']
myseries=pd.Series([True, True, False, True], index=myindex)

a     True
b     True
c    False
d     True
dtype: bool

Cela inclut "c" alors que j'en ai besoin pour renvoyer une liste de a, b et d


0 commentaires

5 Réponses :


4
votes

Le code myseries [myseries] renvoie

a    True
b    True
d    True
dtype: bool

Si vous voulez spécifiquement une liste de ['a', 'b', 'd'] alors vous peut-il par list(myseries[myseries[) .index).


0 commentaires

2
votes

Vous pouvez utiliser list-comrehension pour cela

 ['a', 'b', 'd']

Sortie:

import pandas as pd 

myindex=['a', 'b', 'c' , 'd']
myseries=pd.Series([True, True, False, True], index=myindex)
vals = [i for i,j in myseries.items() if j==True]
print(vals)


0 commentaires

7
votes

Si vous souhaitez simplement renvoyer l'index qui est a, b, c, d dans votre cas, utilisez l'attribut index :

myseries[myseries].index.tolist()
>> ['a', 'b', 'd']

Si vous le souhaitez sous forme de liste:

myindex=['a', 'b', 'c' , 'd']
myseries=pd.Series([True, True, False, True], index=myindex)

a     True
b     True
c    False
d     True
dtype: bool

myseries[myseries].index
>> Index(['a', 'b', 'd'], dtype='object')


0 commentaires

3
votes

Corrigez votre code

myseries.where(myseries).dropna().index
Index(['a', 'b', 'd'], dtype='object')


0 commentaires

3
votes

Filtrer les valeurs d'index par Série :

In [9]: %timeit myseries[myseries].index.tolist()
456 µs ± 28 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [10]: %timeit myseries.where(myseries).dropna().index
1.14 ms ± 28.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [11]: %timeit list(myseries[myseries].index)
886 µs ± 54.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [12]: %timeit [i for i,j in myseries.items() if j==True]
2.13 ms ± 8.36 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Si les performances sont importantes, convertissez les deux en tableau numpy puis filtrez:

np.random.seed(456)

myindex=np.random.randint(100, size=10000).astype(str)
myseries=pd.Series(np.random.choice([True, False], size=10000), index=myindex)
print (myseries)

In [7]: %timeit (myseries.index[myseries].tolist())
178 µs ± 5.5 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [8]: %timeit (myseries.index.values[myseries.values].tolist())
113 µs ± 762 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)


0 commentaires