Find index of last true value in pandas Series or DataFrame
--------------------------------------------------
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Cosmic Puzzle
--
Chapters
00:00 Find Index Of Last True Value In Pandas Series Or Dataframe
00:30 Accepted Answer Score 24
01:29 Answer 2 Score 11
01:51 Answer 3 Score 4
02:09 Thank you
--
Full question
https://stackoverflow.com/questions/3438...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #pandas
#avk47
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Cosmic Puzzle
--
Chapters
00:00 Find Index Of Last True Value In Pandas Series Or Dataframe
00:30 Accepted Answer Score 24
01:29 Answer 2 Score 11
01:51 Answer 3 Score 4
02:09 Thank you
--
Full question
https://stackoverflow.com/questions/3438...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #pandas
#avk47
ACCEPTED ANSWER
Score 24
You can use idxmax what is the same as argmax of Andy Hayden answer:
print s[::-1].idxmax()
Comparing:
These timings are going to be very dependent on the size of s as well as the number (and position) of Trues - thanks.
In [2]: %timeit s.index[s][-1]
The slowest run took 6.92 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 35 µs per loop
In [3]: %timeit s[::-1].argmax()
The slowest run took 6.67 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 126 µs per loop
In [4]: %timeit s[::-1].idxmax()
The slowest run took 6.55 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 127 µs per loop
In [5]: %timeit s[s==True].last_valid_index()
The slowest run took 8.10 times longer than the fastest. This could mean that an intermediate result is being cached
1000 loops, best of 3: 261 µs per loop
In [6]: %timeit (s[s==True].index.tolist()[-1])
The slowest run took 6.11 times longer than the fastest. This could mean that an intermediate result is being cached
1000 loops, best of 3: 239 µs per loop
In [7]: %timeit (s[s==True].index[-1])
The slowest run took 5.75 times longer than the fastest. This could mean that an intermediate result is being cached
1000 loops, best of 3: 227 µs per loop
EDIT:
Next solution:
print s[s==True].index[-1]
EDIT1: Solution
(s[s==True].index.tolist()[-1])
was in deleted answer.
ANSWER 2
Score 11
Use last_valid_index:
In [9]:
s.tail(10)
Out[9]:
h False
w True
h False
r True
q False
b False
p False
e False
q False
d False
dtype: bool
In [8]:
s[s==True].last_valid_index()
Out[8]:
'r'
ANSWER 3
Score 4
argmax gets the first True. Use argmax on the reversed Series:
In [11]: s[::-1].argmax()
Out[11]: 'e'
Here:
In [12]: s.tail()
Out[12]:
n True
e True
k False
d False
l False
dtype: bool