我正在尝试在pandas布尔系列中找到最后一个True值的索引.我目前的代码如下所示.有没有更快或更清洁的方式这样做?
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
jezrael.. 11
您可以使用与Andy Hayden的argmaxidxmax
相同的答案:
print s[::-1].idxmax()
比较:
这些时间将取决于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
编辑:
下一解决方案
print s[s==True].index[-1]
EDIT1:解决方案
(s[s==True].index.tolist()[-1])
被删除的答案.
您可以使用与Andy Hayden的argmaxidxmax
相同的答案:
print s[::-1].idxmax()
比较:
这些时间将取决于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
编辑:
下一解决方案
print s[s==True].index[-1]
EDIT1:解决方案
(s[s==True].index.tolist()[-1])
被删除的答案.
用途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'