Pandas基于配置字典校验输入数据组合有效性代码问题排查
代码逻辑错误排查
你的校验逻辑存在两处核心bug,导致结果不符合预期:
- 存在性判断对象错误:
config_dict的结构为{ContractID: [该合同下所有合法PBID]},config_dict.values()获取到的是所有PBID列表组成的集合,并非单个PBID值,因此s["PBID"] not in config_dict.values()的判断结果永远为True,完全无法正确校验PBID是否合法。 - 分支覆盖不全:当输入记录的ContractID根本不存在于配置表(比如示例中的H4599)时,
config_dict.get(s["ContractID"])会返回None,原逻辑会直接将这类记录判定为Valid,和预期的Invalid结果不符。
修正后代码
import pandas as pd input_df=pd.DataFrame({'Index': [1,2,3,4,5,6], 'ContractID' : ['H9500','H9500','H9500','H3544','H3544','H4599'], 'PBID': ['456','008','002','853','802','465']}) config_df=pd.DataFrame({'ContractID':['H9500','H9500','H3544','H3544','H3544'], 'PBID':['002','008','800','801','802']}) # 把每个合同对应的合法PBID转成集合,判断存在性的效率更高 config_dict={k: set(v) for k,v in config_df.groupby("ContractID")["PBID"]} def test_6_3(s): valid_pbid_list = config_dict.get(s["ContractID"]) # 两类无效场景:合同ID不在配置表、合同ID存在但PBID不在该合同的合法列表中 if not valid_pbid_list or s["PBID"] not in valid_pbid_list: return "Invalid" return "Valid" input_df['test_6_3'] = input_df.apply(test_6_3, axis=1) print(input_df)
运行结果
执行代码后输出完全匹配预期:
Index ContractID PBID test_6_3 0 1 H9500 456 Invalid 1 2 H9500 008 Valid 2 3 H9500 002 Valid 3 4 H3544 853 Invalid 4 5 H3544 802 Valid 5 6 H4599 465 Invalid
性能提示:当配置表数据量较大时,用set存储合法PBID比list的查找效率高很多,能大幅缩短apply的执行时间。
内容的提问来源于stack exchange,提问作者shockwave
相关产品推荐
相关产品推荐

