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=1
的 DataFrame.interpolate
处理每行,limit_area='inside'
处理 NaN
被有效值包围的值,limit=1
处理填充的最大值1
.
还有一个默认参数limit_direction='forward'
,所以如果NaN
s的值更多,只有第一个被替换。您可以通过另一个 interpolate
和 limit_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
我有一个数据框,其中散布着几个空值。我想用同一行中上一个和下一个值的平均值来估算空值的值,但仅适用于在其左右列上具有数值的空值。
在下面的例子中,我想只计算 第二行 和 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
使用带参数 axis=1
的 DataFrame.interpolate
处理每行,limit_area='inside'
处理 NaN
被有效值包围的值,limit=1
处理填充的最大值1
.
还有一个默认参数limit_direction='forward'
,所以如果NaN
s的值更多,只有第一个被替换。您可以通过另一个 interpolate
和 limit_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