熊猫系列:如何在每个元素之前获得第n个非零元素

时间:2017-06-19 18:59:42

标签: python python-2.7 pandas

我有一个像这样的熊猫系列:

[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]

熊猫有内置方式可以轻松完成吗?

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