Reputation: 53896
Here I access the value of a series depending on a predicate :
import numpy as np
s = pd.Series(np.array([1,2,3]))
print(type(s))
print([i for i in s if i > 2])
returns :
<class 'pandas.core.series.Series'>
[3]
How to access the index of the value(s) that match the predicate so in this case the index is 2
.
Upvotes: 2
Views: 40
Reputation: 863791
Use boolean indexing
with index
:
print (s.index[s > 2])
#alternative
#print (s[s > 2].index)
Int64Index([2], dtype='int64')
Your solution should be changed with Series.items
:
print([k for k, v in s.items() if v > 2])
[2]
Performance is different in larger data:
np.random.seed(45)
s = pd.Series(np.random.randint(5, size=100000))
#print (s)
In [93]: %timeit ([k for k, v in s.items() if v > 2])
13.3 ms ± 768 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [94]: %timeit (s.index[s > 2])
930 µs ± 12.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [95]: %timeit (s[s > 2].index)
1.74 ms ± 26.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [96]: %timeit (s.index[s.values > 2])
742 µs ± 79.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [97]: %timeit (s.index.values[s.values > 2])
647 µs ± 12.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [98]: %timeit (s[s.values > 2].index.values)
1.51 ms ± 12.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Upvotes: 1