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
5 Réponses :
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).
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)
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')
Corrigez votre code
myseries.where(myseries).dropna().index Index(['a', 'b', 'd'], dtype='object')
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)