Pandas 用行中上一个和下一个值的平均值估算 Null

Pandas impute Null with average of previous and next value in the row

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

在下面的例子中,我想只计算 第二行 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

使用带参数 axis=1DataFrame.interpolate 处理每行,limit_area='inside' 处理 NaN 被有效值包围的值,limit=1 处理填充的最大值1.

还有一个默认参数limit_direction='forward',所以如果NaNs的值更多,只有第一个被替换。您可以通过另一个 interpolatelimit_direction='backward' 找到它,并测试用于在 DataFrame.mask:

之后替换的缺失值
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)

详情:

print (df.bfill(axis=1, limit=1))
    c1    c2    c3   c4
0  1.0   2.0   3.0  4.0
1  5.0   NaN   8.0  8.0
2  9.0  11.0  11.0  NaN