[英]Find index of last true value in pandas Series or DataFrame
I'm trying to find the index of the last True value in a pandas boolean Series. 我正在尝试在pandas布尔系列中找到最后一个True值的索引。 My current code looks something like the below. 我目前的代码如下所示。 Is there a faster or cleaner way of doing this? 有没有更快或更清洁的方式这样做?
import numpy as np
import pandas as pd
import string
index = np.random.choice(list(string.ascii_lowercase), size=1000)
df = pd.DataFrame(np.random.randn(1000, 2), index=index)
s = pd.Series(np.random.choice([True, False], size=1000), index=index)
last_true_idx_s = s.index[s][-1]
last_true_idx_df = df[s].iloc[-1].name
You can use idxmax
what is the same as argmax of Andy Hayden answer : 您可以使用idxmax
与Andy Hayden的argmax相同的答案 :
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. 这些时间将取决于s的大小以及Trues的数量(和位置) - 谢谢。
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 EDIT1:解决方案
(s[s==True].index.tolist()[-1])
was in deleted answer. 被删除的答案。
Use last_valid_index
: 使用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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.