You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 19:21:29