如何使用查找表实现pandas DataFrame缺失值fillna填充
基于预构建查找表的merge关联填充方案
核心逻辑是先通过关联把查找表的正确值匹配到主表,再仅对目标列的缺失位置做定向填充,全程不会改动非缺失行的原有数值。
假设你的主数据集为df,存储正确匹配关系的查找表为lookup_df,两表通过共有唯一标识字段(例如商品IDItem_Identifier,可根据实际业务替换为多字段联合匹配键)做关联:
- 预处理查找表,按匹配键去重,避免关联时出现行数膨胀
# 按匹配键去重,保留每个键对应的第一条正确值即可 lookup_df = lookup_df.drop_duplicates(subset=['Item_Identifier']) - 左连接关联主表与查找表,将查找表中的正确重量重命名为临时列,避免和原列重名冲突
df_merged = df.merge( lookup_df[['Item_Identifier', 'Item_Weight']].rename(columns={'Item_Weight': 'correct_weight'}), on='Item_Identifier', how='left' ) - 仅对
Item_Weight列的缺失值用关联到的正确值填充,非缺失值完全保留df_merged['Item_Weight'] = df_merged['Item_Weight'].fillna(df_merged['correct_weight']) - 删除临时辅助列,得到最终处理完的数据集
df = df_merged.drop(columns=['correct_weight'])
注意:如果需要多个字段联合才能匹配到正确重量(例如商品分类+商品ID),直接将
merge方法的on参数替换为匹配键列表即可,例如on=['Item_Type', 'Item_Identifier']。
无预构建查找表的可行填充方案
如果没有提前准备查找表,可以根据数据特征和业务逻辑选择以下方案:
- 同组聚合值填充:适合存在固定分组逻辑的场景,例如同一商品ID对应的重量本身是固定值,可直接用主表现有数据的分组统计值填充,不需要额外构建查找表。优先选择分组众数、分组中位数,连续值也可使用分组均值:
# 按商品ID分组,用每组已有的重量中位数填充同组缺失值 df['Item_Weight'] = df.groupby('Item_Identifier')['Item_Weight'].transform( lambda x: x.fillna(x.median()) ) - 全局统计值填充:适合缺失占比极低、无有效分组维度的场景,优先选择抗极端值干扰的全局中位数填充,均值填充容易受异常值拉扯出现偏差:
df['Item_Weight'] = df['Item_Weight'].fillna(df['Item_Weight'].median()) - 顺序插值填充:适合数据集本身有明确排列顺序的场景(例如按同批次录入顺序、货架排序排列),可选择前向/后向填充、线性插值补值:
# 前向填充:用前一条相邻的有效值补当前缺失 df['Item_Weight'] = df['Item_Weight'].ffill() # 线性插值:根据缺失位置前后的有效值按线性变化趋势计算填充值 df['Item_Weight'] = df['Item_Weight'].interpolate(method='linear') - 模型预测填充:适合缺失占比不低、且存在多个和重量强相关字段的场景(例如商品分类、售价、体积、包装规格),可以用非缺失数据训练简单回归模型,用模型输出的预测值填充缺失。注意该方法会引入模型误差,填充后需要校验填充值的分布和原始数据分布是否一致。
内容的提问来源于stack exchange,提问作者Lhannz
相关产品推荐
相关产品推荐

