2015-11-14 68 views
1

假設我有以下數據框:如何爲熊貓插值方法指定「最大增量x」?

> print df 
     C  B 
A    
1 NaN  1 
2 200 NaN 
3 300  3 
4 400 NaN 
50 NaN 1000 

我想用method='values'插值B列。但是,如果連續行之間的增量X超過某個閾值,我需要NaN。例如,如果我指定最大增量x爲3,則預計如下所示:

> print df 
     C  B 
A    
1 NaN  1 
2 200  2 
3 300  3 
4 400 NaN 
50 NaN 1000 

請注意列4的值如何保持爲NaN。

+0

嗯。如果您知道在所需列中有交替值和NaN,則有一種利用數據結構的巧妙方法。是這樣嗎?列B始終是值,NaN,值,南,(...)? – vmg

+0

Nope @vmg。我不能做出這樣的假設。 – user2076663

回答

0

嗯,這裏就是我想出了:

def interpolate_data_frame(df, column, max_delta_x=None): 
    if max_delta_x is None: 
     df[column] = df[column].interpolate(method='values') 
     return df 

    df['previous_x'] = (df['B']/df['B'] * df.index).fillna(method='ffill') 
    df['next_x'] = (df['B']/df['B'] * df.index).fillna(method='bfill') 
    df['delta_x'] = df['next_x'] - df['previous_x'] 
    df['valid'] = (df['delta_x'] < max_delta_x).map(lambda x: 1 if x else np.nan) 
    df[column] = df[column].interpolate(method='values') * df['valid'] 
    del(df['previous_x']) 
    del(df['next_x']) 
    del(df['delta_x']) 
    del(df['valid']) 
    return df