熊猫使用行中上一个和下一个值的平均值估算Null

时间:2019-09-24 06:12:53

标签: python pandas null imputation

我有一个数据框,零散分布着几个Null。我想用同一行中的上一个和下一个值的平均值来估算Null的值,但仅适用于在其左和右列中具有数字值的null。

在下面的示例中,我只想估算第二行和列 c2

中的Nan
import pandas as pd
import numpy as np

df = pd.DataFrame([[1, 2, 3, 4], [5,np.nan,np.nan,8], [9,np.nan,11,np.nan]], columns=['c1', 'c2', 'c3', 'c4'])

退出

   c1   c2    c3   c4
0   1  2.0   3.0  4.0
1   5  NaN   NaN  8.0
2   9  NaN  11.0  NaN

将成为

   c1   c2    c3   c4
0   1  2.0   3.0  4.0
1   5  NaN   NaN  8.0
2   9  10  11.0  NaN   <-- value 10 replaces Nan

1 个答案:

答案 0 :(得分:2)

DataFrame.interpolate与参数axis=1用于每行处理,limit_area='inside'用于处理NaN的有效值包围的值,而limit=1用于填充最大{{ 1}}。

还有默认参数1,因此,如果更多limit_direction='forward'的值仅被替换。您可以用另一个NaN和其他interpolate来找到它,并测试DataFrame.mask之后用于替换的缺失值:

limit_direction='backward'

详细信息

mask = df.interpolate(axis=1, limit_area='inside', limit=1, limit_direction='backward').isna()
df1 = df.interpolate(axis=1, limit_area='inside', limit=1).mask(mask)
print (df1)
    c1    c2    c3   c4
0  1.0   2.0   3.0  4.0
1  5.0   NaN   NaN  8.0
2  9.0  10.0  11.0  NaN

类似的想法是使用print (df.interpolate(axis=1, limit_area='inside', limit=1)) c1 c2 c3 c4 0 1.0 2.0 3.0 4.0 1 5.0 6.0 NaN 8.0 2 9.0 10.0 11.0 NaN print (df.interpolate(axis=1, limit_area='inside', limit=1, limit_direction='backward')) c1 c2 c3 c4 0 1.0 2.0 3.0 4.0 1 5.0 NaN 7.0 8.0 2 9.0 10.0 11.0 NaN 的回填来测试缺失值:

limit=1

详细信息

mask = df.bfill(axis=1, limit=1).isna()
df1 = df.interpolate(axis=1, limit_area='inside', limit=1).mask(mask)