我有一个像这样的熊猫系列:
[0,3,4,5,0,0,2,4,5]
对于每个元素,我希望能够在它之前获得第n个非零元素。
上述输入系列的输出系列将是
n=1
[NaN,NaN,3,4,5,5,5,2,4]
n=2
[NaN,NaN,NaN,3,4,4,4,5,2]
等
熊猫有内置方式可以轻松完成吗?
答案 0 :(得分:1)
您可以使用rolling和apply从滚动窗口中提取第n个非零元素。
首先我们使用rolling(len(s)),它给出了一个滚动的9行窗口,直到每行的当前行。然后我们从滚动窗口中删除0。 x [: - 1]是排除当前行,因为我们需要在它之前找到非零元素。最后,我们通过[-n]。
从非零列表中提取第n个元素n=1
s.rolling(len(s),min_periods=0)\
.apply(lambda x: x[:-1][x[:-1]!=0][-n] if len(x[:-1][x[:-1]!=0])>=n else np.nan)
Out[97]:
0 NaN
1 NaN
2 3.0
3 4.0
4 5.0
5 5.0
6 5.0
7 2.0
8 4.0
dtype: float64
n=2
s.rolling(len(s),min_periods=0)\
.apply(lambda x: x[:-1][x[:-1]!=0][-n] if len(x[:-1][x[:-1]!=0])>=n else np.nan)
Out[99]:
0 NaN
1 NaN
2 NaN
3 3.0
4 4.0
5 4.0
6 4.0
7 5.0
8 2.0
dtype: float64
答案 1 :(得分:-1)
def dew(zoop, n):
x = zoop.pop()
zoop.reverse()
for i in range(len(zoop)):
if not zoop[i] == 0:
n -= 1
if n == 0:
return zoop[i]
return float('NaN')
lzt = [0,3,4,5,0,0,2,4,5]
ans = []
for i in range(len(lzt)):
ans.append(dew(lzt[:i+1], 2)) #2 is n here