2017-03-28 54 views
3

熊貓有沒有辦法插入單個缺失的數據點?也就是說,如果連續有2個NaN,我想讓他們獨處。只有單個NaN才能插值

所以,作爲一個例子:

s = pd.Series([1, None, 2, 3, None, None, 4.5]) 
d.interpolate(limit=1) 

給我:

[ 1.0, 1.5, 2.0, 3.0, 3.5, NaN, 4.5 ] 

,但我想獲得

[ 1.0, 1.5, 2.0, 3.0, NaN, NaN, 4.5 ] 

如果有幫助,我有一個列表只有單個缺失值的索引。

+0

也許[這個問題](HTTP://計算器.COM /問題/ 30533021/interpola te-or-extra-only-small-gap-in-pandas-dataframe)可以幫助你。 –

回答

4

我的意見是,這將是一個偉大的能力,包括在interpolate。這就是說,這可以歸結爲掩蓋了存在多個np.nan的地方。我將在一個方便的函數中用一些numpy邏輯包裝起來。

def cnan(s): 
    v = s.values 
    k = v.size 
    n = np.append(np.isnan(v), False) 
    m = np.empty(k, np.bool8) 
    m.fill(True) 
    i = np.where(n[:-1] & n[1:])[0] + np.arange(2) 
    m[i[i < k]] = False 
    return m 

s.interpolate().where(cnan(s)) 

0 1.0 
1 1.5 
2 2.0 
3 3.0 
4 NaN 
5 NaN 
6 4.5 
dtype: float64 

對於使用那些有興趣在一個通用的解決方案先進numpy技術

import pandas as pd 
import numpy as np 
from numpy.lib.stride_tricks import as_strided as strided 

def mask_knans(a, x): 
    a = np.asarray(a) 
    k = a.size 
    n = np.append(np.isnan(a), [False] * (x - 1)) 
    m = np.empty(k, np.bool8) 
    m.fill(True) 

    s = n.strides[0] 
    i = np.where(strided(n, (k + 1 - x, x), (s, s)).all(1))[0][:, None] 
    i = i + np.arange(x) 
    i = pd.unique(i[i < k]) 

    m[i] = False 

    return m 

演示

a = np.array([1, np.nan, np.nan, np.nan, 3, np.nan, 4, 5, np.nan, np.nan, 6, 7]) 

print(mask_knans(a, 3)) 

[ True False False False True True True True True True True True] 
+0

如果此答案有幫助,請參閱我的其他[***問題***](http://stackoverflow.com/q/43082316/2336654)和[***答案***](http:///stackoverflow.com/a/43082317/2336654) – piRSquared

2
s[(s.shift(-1).notnull()) & (s.shift(1).notnull())] = (s.shift(-1) + s.shift(1))/2 

其實,

s[s.isnull()] = (s.shift(-1) + s.shift(1))/2 

工作爲好,如果你正在做簡單的插值。

相關問題