2016-11-26 79 views
1

我在看窗口函數的教程,但我不明白爲什麼下面的代碼會產生NaN。熊貓軋製給出NaN

如果我理解正確,代碼會創建一個大小爲2的滾動窗口。爲什麼第一行,第四行和第五行有NaN?起初,我認爲這是因爲用另一個數字添加NaN會產生NaN,但是我不確定爲什麼第二行不會是NaN。

dft = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]}, 
        index=pd.date_range('20130101 09:00:00', periods=5, freq='s')) 


In [58]: dft.rolling(2).sum() 
Out[58]: 
         B 
2013-01-01 09:00:00 NaN 
2013-01-01 09:00:01 1.0 
2013-01-01 09:00:02 3.0 
2013-01-01 09:00:03 NaN 
2013-01-01 09:00:04 NaN 
+0

這將允許你刪除如果這就是你想要做的:'dft [dft ['B']。notnull()]。rolling(2).sum()' – blacksite

回答

3

要注意的第一件事是,在默認情況下rolling尋找N-1之前的數據行聚集,其中n是窗口大小。如果沒有滿足該條件,它將返回窗口的NaN。這是第一行發生的事情。在第四和第五行,這是因爲總和中的一個值是NaN。

如果你想避免返回NaN時,你可以通過min_periods=1,它可以降低窗口所需的最小數量的有效觀測值1,而不是2的方法:

>>> dft.rolling(2, min_periods=1).sum() 
         B 
2013-01-01 09:00:00 0.0 
2013-01-01 09:00:01 1.0 
2013-01-01 09:00:02 3.0 
2013-01-01 09:00:03 2.0 
2013-01-01 09:00:04 4.0 
+0

我認爲對我來說關鍵的是知道這是n-1(而不是n),謝謝! – Huey

0

事實上,添加NAN和其他任何東西都會給NAN。所以:

input + rolled = sum 
    0  nan nan 
    1  0  1 
    2  1  3 
    nan  2 nan 
    4  nan nan 

沒有理由第二行是NAN,因爲它原來的第一和第二元素,這兩者都不是NAN的總和。

另一種方式來做到這一點是:

dft.B + dft.B.shift()