51851


こんにちは，お世話になります．

pandasの`interpolate()`メソッドで欠損値処理を行いたいと思っています．  
このとき，欠損値がｎ個連続している場合は，その部分に関して補間をそもそも行わない，と指示したいのですが，どうすれば良いのでしょうか．

例えば，n＝3だとすると，

[code]

    ...-5,NaN,NaN,6,10...
    
[/code]

では補間を行い，

[code]

    ...-5,NaN,NaN,NaN,6,10,...
    
[/code]

では，補間処理を行わないようにしたいです．

引数`limit`を使うと行いたい作業ができるか？と思い，調べてみました．しかし，こちら[pandasで欠損値NaNを前後の値から補間するinterpolate](https://note.nkmk.me/python-
pandas-interpolate/)を参照すると，欠損値が連続している場合に補完する個数の最大値を指定するものだったため，望みの処理は行えませんでした．

ご教授お願いいたします．


CC BY-SA 4.0
2019-01-09T09:47:41.510
51841
2019-01-10T01:18:54.030
27841
question
python pandas
pandas 欠損値が連続しているときの補間について


> 欠損値がｎ個連続している場合は，その部分に関して補間をそもそも行わない，と指示したい

であれば単純に、予め欠損値が何個連続しているかを求めておき、その数がn個の箇所をマスクした上で補間を行うとよいのではないでしょうか。

[code]

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({
        'data':[1,2,3,np.nan,np.nan,np.nan,7,8,np.nan,10,np.nan,np.nan,13,14]
    })
    print(df.loc[:,['data']])
    #    data
    #0    1.0
    #1    2.0
    #2    3.0
    #3    NaN
    #4    NaN
    #5    NaN
    #6    7.0
    #7    8.0
    #8    NaN
    #9   10.0
    #10   NaN
    #11   NaN
    #12  13.0
    #13  14.0
    
    # 欠損値が連続している箇所毎にグループ番号を振る
    df['nan_group'] = (df['data'].isna() & df['data'].shift(1).notna()).where(df['data'].isna()).cumsum()
    # 上記のグループ毎に欠損値が何個連続しているかを求める
    df['nan_count'] = df['nan_group'].map(df.groupby('nan_group').size())
    # 箇所毎にグループ番号はもう使わないので削除
    df = df.drop(columns=['nan_group'])
    
    # 欠損値がN個連続している箇所以外を補間
    N=3
    df['data'] = df.loc[df.nan_count != N, 'data'].interpolate()
    print(df.loc[:,['data']])
    #    data
    #0    1.0
    #1    2.0
    #2    3.0
    #3    NaN
    #4    NaN
    #5    NaN
    #6    7.0
    #7    8.0
    #8    9.0
    #9   10.0
    #10  11.0
    #11  12.0
    #12  13.0
    #13  14.0
    
[/code]


CC BY-SA 4.0
2019-01-10T01:18:54.030
51851
2019-01-10T01:18:54.030
24801
51841
answer