我有一个如下所示的df。我想用两个值之间的某个值填充NA。
col1 col2 col3 col4 col5 col6 col7 col8
0 NaN 12 12.0 4.0 NaN NaN NaN NaN
1 54.0 54 32.0 11.0 21.0 NaN NaN NaN
2 3.0 34 34.0 NaN NaN 43.0 NaN NaN
3 34.0 34 NaN NaN 34.0 34.0 34.0 34.0
4 NaN 34 34.0 NaN 34.0 34.0 34.0 34.0
例如,我不想在第一行和第二行填写,因为NaN
不会在值之间出现。但我想在col4和col5的第三行中填写。因为这两列在两个值(col3和col6)之间包含NaN。
操作方法
预期输出:
col1 col2 col3 col4 col5 col6 col7 col8
0 NaN 12 12.0 4.0 NaN NaN NaN NaN
1 54.0 54 32.0 11.0 21.0 NaN NaN NaN
2 3.0 34 34.0 -100 -100 43.0 NaN NaN
3 34.0 34 -100 -100 34.0 34.0 34.0 34.0
4 NaN 34 34.0 -100 34.0 34.0 34.0 34.0
对于这个问题
我不能简单地使用fillna
,因为它将完全填满,同样,我也不能使用ffill
或bfill
,因为它违反了前导或尾随值。我在这个阶段一无所知。任何帮助都是可观的。
注意:在与此相关的搜索之后,我提出了这个问题。我找不到与此相关的任何重复项。如果您愿意,可以将其标记为重复。
答案 0 :(得分:2)
我认为您需要通过2种方法获得布尔值掩码,其中缺少值的列没有第一行和最后一行-向前填充和向后填充丢失的值,并通过比较>0
检查不丢失或创建累积和: >
m = df.ffill(axis=1).notnull() & df.bfill(axis=1).notnull()
#alternative mask
a = df.notnull()
m = a.cumsum(axis=1).gt(0) & a.iloc[:, ::-1].cumsum(axis=1).gt(0)
df = df.mask(m, df.fillna(-100))
print (df)
col1 col2 col3 col4 col5 col6 col7 col8
0 NaN 12 12.0 4.0 NaN NaN NaN NaN
1 54.0 54 32.0 11.0 21.0 NaN NaN NaN
2 3.0 34 34.0 -100.0 -100.0 43.0 NaN NaN
3 34.0 34 -100.0 -100.0 34.0 34.0 34.0 34.0
4 NaN 34 34.0 -100.0 34.0 34.0 34.0 34.0
详细信息:
print (m)
col1 col2 col3 col4 col5 col6 col7 col8
0 False True True True False False False False
1 True True True True True False False False
2 True True True True True True False False
3 True True True True True True True True
4 False True True True True True True True