Python Pandas使用行中上一个和下一个值的平均值输入Null
我有一个数据帧,有几个空值散布在这里和那里。我想用同一行中上一个值和下一个值的平均值来插补空值,但只针对在其左右列上有数值的空值 在下面的示例中,我只想计算第二行和第c2列中的Nan OutPython 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
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。我知道一种方法是删除该列,稍后可能会引入它,但寻找更有效的解决方案。