Pandas校验prod_price字段价格 移除明显错误的异常数据行
校验
prod_price字段删除异常数据行方案 针对你这个宠物商品订单数据集,直接按下面的逻辑处理就行,能覆盖所有明显价格错误,大数据量下运行也不会出问题。
异常判定规则
价格属于强业务规则字段,明显错误的判定不需要复杂模型,按常识和业务逻辑卡阈值即可:
- 非数值类型的价格:比如混入字符串、空值
- 小于等于0的价格:商品单价不可能为0、负数
- 同一条码(
prod_upc是商品唯一标识,同UPC一定是同一款标品)的价格偏离标准定价10%以上的:属于录入时打错数字的错误
可直接运行的处理代码
import pandas as pd import numpy as np from checker.binder import binder; binder.bind(globals()) from intro_data_analytics.check_scrubbing import * df = pd.read_csv('data/inu_neko_orderline.csv') # 第一步:统一把价格字段转成数值格式,无法转换的脏数据直接置为空值 df['prod_price'] = pd.to_numeric(df['prod_price'], errors='coerce') # 筛掉基础异常:空值、价格小于等于0的行 df = df[df['prod_price'] > 0].copy() # 第二步:校验同商品价格一致性,筛掉录入错误的异常价格 # 取每个UPC对应商品出现频次最高的价格作为标准定价 upc_correct_price = df.groupby('prod_upc')['prod_price'].agg( lambda x: x.mode()[0] if not x.mode().empty else x.median() ).to_dict() df['ref_price'] = df['prod_upc'].map(upc_correct_price) # 剔除和标准定价偏差超过10%的错误行,正常标品定价不会有这么大的随机波动 df = df[abs(df['prod_price'] - df['ref_price']) / df['ref_price'] <= 0.1].copy() # 删除临时辅助列 df.drop(columns=['ref_price'], inplace=True)
之前处理出错的常见原因
- 读入csv时
prod_price列混有字符串类脏值,没有先转数值类型就做大小判断,会触发类型错误或者判断逻辑失效 - 没有用
prod_upc这个商品唯一标识做分组校验,直接全表设价格上下限的话,不同品类商品价格差很大(零食类十几元、窝具类几十元),很容易漏判错判
你贴的数据集预览里能看到所有行的
total_sales都为0,这个字段后续也可以加校验:正常total_sales应该等于prod_price * trans_quantity,如果和计算值偏差过大也属于错误行,可以按需补充规则。
内容的提问来源于stack exchange,提问作者devina pandey
相关产品推荐
相关产品推荐

