我想在pandas系列中找到最后一个非零元素的索引。我可以用循环来做到这一点:
ilast = 0
for i in mySeries.index:
if abs(mySeries[i]) > 0:
ilast = i
有清洁剂吗?做得更短的方式?
答案 0 :(得分:6)
我可能只写s[s != 0].index[-1]
,例如
>>> s = pd.Series([0,1,2,3,0,4,0],index=range(7,14))
>>> s
7 0
8 1
9 2
10 3
11 0
12 4
13 0
dtype: int64
>>> s[s != 0].index[-1]
12
最初我认为使用nonzero
会让事情更简单,但我能想到的最好的是
>>> s.index[s.nonzero()[0][-1]]
12
这个例子的速度要快得多(快30倍),但我不喜欢它的外观.. YMMV。
答案 1 :(得分:0)
刚刚提出了一些解决方案。
它与发电机的几种方式:
max(i for i in s.index if s[i] != 0) # will work only if index is sorted
和
next(i for i in s.index[::-1] if s[i] != 0)
非常易读且相对较快。
通过numpy的trip_zeros
:
import numpy as np
np.trim_zeros(s, 'b').index[-1]
比两个@DSM答案都慢。
<强>要点:强>
timeit np.trim_zeros(s, 'b').index[-1]
10000 loops, best of 3: 89.9 us per loop
timeit s[s != 0].index[-1]
10000 loops, best of 3: 68.5 us per loop
timeit next(i for i in s.index[::-1] if s[i] != 0)
10000 loops, best of 3: 19.4 us per loop
timeit max(i for i in s.index if s[i] != 0)
10000 loops, best of 3: 16.8 us per loop
timeit s.index[s.nonzero()[0][-1]]
100000 loops, best of 3: 1.94 us per loop