Python Pandas使用行中上一个和下一个值的平均值输入Null

Python Pandas使用行中上一个和下一个值的平均值输入Null,python,pandas,null,imputation,Python,Pandas,Null,Imputation,我有一个数据帧,有几个空值散布在这里和那里。我想用同一行中上一个值和下一个值的平均值来插补空值,但只针对在其左右列上有数值的空值 在下面的示例中,我只想计算第二行和第c2列中的Nan Out 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

我有一个数据帧,有几个空值散布在这里和那里。我想用同一行中上一个值和下一个值的平均值来插补空值,但只针对在其左右列上有数值的空值

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

Out

   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
c1 c2 c3 c4
0   1  2.0   3.0  4.0
1.5楠楠8.0
2 9 10 11.0 NaN与参数
轴=1
一起用于每行处理,
limit\u area='inside'
用于处理由有效值包围的
NaN
s值,
limit=1
用于填充最大值
1

还有一个默认参数
limit\u direction='forward'
,因此如果有更多的
NaN
s值,则只替换第一个。您可以通过另一个
插值
limit\u direction='backward'
找到它,并测试用于替换后的缺失值:

详细信息

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
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
类似的想法是使用
limit=1
对测试缺失值进行回填:

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

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
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

哇-从未使用过这两种功能。我可以指定我的自定义函数而不是avg吗?@Ali-它更复杂,因为
interpolate
使用一些默认方法。我们可以指定插值应该工作的列,而不指定其他列。例如,我可以指定只考虑列C1、C2和C3,而不考虑C4。我知道一种方法是删除该列,稍后可能会引入它,但寻找更有效的解决方案。