Pandas如何按price规则匹配填充materialNumber列缺失值
Pandas按价格规则填充materialNumber列缺失值
填充规则
处理materialNumber列缺失值时遵循两级匹配逻辑:
- 优先匹配
price完全相同的非缺失materialNumber记录,同价存在多条有效记录时,取首次出现的值填充 - 无完全匹配价格时,选取与当前行
price差值最小的邻近记录对应的materialNumber填充
问题分析
原有尝试代码无法实现预期效果,核心问题有三点:
- 逐行
apply传入的是单行Series数据,无法获取全量有效参考记录做匹配 - 逻辑中
input变量未定义,无法计算价格差值 - 函数返回值为DataFrame结构,和单列填充要求的维度不匹配
实现代码
import pandas as pd import numpy as np # 构造样例数据 d = { "customerId": [1, 1, 2, 2, 3, 3], "materialNumber": [1234, 4562, None, 4562, 1547, None], "price": [100, 20, 100, 30, 40, 37], } df = pd.DataFrame(data=d) # 第一步:预处理有效参考映射,同price保留首次出现的materialNumber valid_records = df.dropna(subset=['materialNumber']).drop_duplicates(subset=['price'], keep='first') price_mat_map = dict(zip(valid_records['price'], valid_records['materialNumber'])) # 完成第一优先级:完全匹配价格填充 df['materialNumber'] = df['materialNumber'].fillna(df['price'].map(price_mat_map)) # 预处理参考数组,加速最近邻计算 ref_price_arr = valid_records['price'].values ref_mat_arr = valid_records['materialNumber'].values # 第二步:填充剩余无完全匹配的缺失值,取价格差最小的对应materialNumber def nearest_fill(row): if pd.notna(row['materialNumber']): return row['materialNumber'] min_diff_idx = np.abs(ref_price_arr - row['price']).argmin() return ref_mat_arr[min_diff_idx] df['materialNumber'] = df.apply(nearest_fill, axis=1) # 如需物料号为整数类型,可放开下一行注释 # df['materialNumber'] = df['materialNumber'].astype(int) print(df)
运行结果
执行代码后输出与预期完全一致:
customerId materialNumber price 0 1 1234.0 100 1 1 4562.0 20 2 2 1234.0 100 3 2 4562.0 30 4 3 1547.0 40 5 3 1547.0 37
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

