我有一个数据框,零散分布着几个Null。我想用同一行中的上一个和下一个值的平均值来估算Null的值,但仅适用于在其左和右列中具有数字值的null。
在下面的示例中,我只想估算第二行和列 c2
中的Nanimport 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
答案 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)