如何填充Pandas DataFrame中两个相同有效值之间的NaN值
实现方案
我们可以利用**正向填充(ffill)和反向填充(bfill)**的结果对比来定位需要填充的位置:两个相同有效值之间的NaN,正向填充结果和反向填充结果完全一致;而有效值外侧的NaN,正向和反向填充结果必然不一致,利用这个特性就能精准完成填充。
完整实现代码
import pandas as pd import numpy as np # 构造示例DataFrame data = { 'time_expanded': ['10:30:00', '10:30:10', '10:30:20', '10:30:30', '10:30:40', '10:30:50', '10:31:00', '10:31:10', '10:31:20', '10:31:30'], 'start_time': [np.nan, '10:30:10', np.nan, np.nan, '10:30:10', np.nan, '10:31:00', np.nan, '10:31:00', np.nan], 'end_time': [np.nan, '10:30:40', np.nan, np.nan, '10:30:40', np.nan, '10:31:20', np.nan, '10:31:20', np.nan], 'name': [np.nan, '11v11', np.nan, np.nan, '11v11', np.nan, 'zonal_game', np.nan, 'zonal_game', np.nan] } df = pd.DataFrame(data) # 指定需要填充的列 fill_cols = ['start_time', 'end_time', 'name'] for col in fill_cols: # 分别生成正向、反向填充结果 ffill_val = df[col].ffill() bfill_val = df[col].bfill() # 仅当正向和反向填充结果相同时,才用该值填充NaN,否则保留原有NaN df[col] = df[col].fillna(ffill_val.where(ffill_val == bfill_val)) print(df)
逻辑说明
- 对于两个相同有效值中间的NaN:正向填充取前面的有效值,反向填充取后面的有效值,两者相等,所以会被填充
- 对于有效值外侧的NaN:要么正向填充结果为NaN,要么反向填充结果为NaN,或者两者取值不同,不会被填充
内容的提问来源于stack exchange,提问作者Christian Rønsholt
相关产品推荐
相关产品推荐

