2017-06-19 87 views
1

我有熊貓系列像在此之前獲得的第n個非零元素:熊貓系列:如何每個元素

[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

也許使用http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.Series.nonzero.html,但它不是直接.... – Dadep

回答

1

您可以使用滾動和應用從滾動窗口中提取第n個非零元素。

首先,我們使用滾動(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 
+0

這似乎正在工作。代碼看起來相當複雜。你能解釋一下代碼中發生了什麼嗎? – ishan3243

+0

@ ishan3243,我在代碼中添加了一些註釋。讓我知道它是否有幫助。 – Allen

+0

瞭解。謝謝您的幫助。 – ishan3243

-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 
+0

這不使用任何內置的熊貓功能。這個問題特別要求它。 – ishan3243

+0

這是由於缺乏解釋投票嗎?或者它曾經有過的錯誤?編輯:啊這就是爲什麼。 Okie doke –