如何在Pandas中仅当前后非NaN值相等时填充对应NaN值
实现方法
要实现这个需求,核心逻辑是为每个NaN值匹配到它前向最近的非空值和后向最近的非空值,只有当两个值相等时,才用这个值填充对应NaN,否则保留原NaN值。
完整代码
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({'A': [1, np.nan, np.nan, np.nan, 3, 3, 3, 3, np.nan, np.nan, np.nan, 5, 5, 5, 6, 6, 6, np.nan, np.nan, np.nan, 6, 7, 8, 9, 10,np.nan, np.nan, 10, 11]}) # 生成每个位置对应的前向最近非空值、后向最近非空值 prev_valid = df['A'].ffill() next_valid = df['A'].bfill() # 仅当前后最近非空值相等时填充,否则保留原值 df['fill_nan'] = np.where(prev_valid == next_valid, prev_valid, df['A'])
代码说明
ffill():pandas内置的前向填充方法,会沿着列从上到下,用遇到的上一个非空值填充所有后续NaN,直到遇到下一个非空值为止,正好可以得到每个位置的前向最近非空值。bfill():pandas内置的后向填充方法,和ffill()逻辑相反,从下到上填充,得到每个位置的后向最近非空值。np.where(条件, 满足条件返回值, 不满足返回值):用来做条件判断,只有当前后最近非空值相等时,才用该值填充,否则保留原列A的数值(包括原有的NaN)。
运行后得到的fill_nan列和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

