2017-03-28 7 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:// stackoverflowの.com/questions/30533021/interpolaパノラマのデータフレーム)があなたを助けることができます。 –

答えて

4

私の意見では、これはinterpolateに含めることができます。
これは、1つ以上の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

この回答が参考になった場合は、私の他の[*** QUESTION ***](http://stackoverflow.com/q/43082316/2336654)と[*** ANSWER ***](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 

は、同様に動作します。