基于Pandas行值构建MultiIndex实现配药正负行匹配、合并及无效退款清理
Pandas配药/退款记录匹配合并实现方案
原实现代码的核心问题
- 列选取语法错误:
.loc取多列时需将列名放入列表传入,直接拼接列名会触发行索引定位逻辑,直接报错 - 逐行遍历匹配效率极低,且容易因为同姓名下不同处方号的记录交叉出现匹配错位
- 依赖
shift(1)判断退款的逻辑,要求退款记录必须紧跟在对应配药记录之后,无法适配业务数据顺序打乱的真实场景 - 无效退款记录的清理逻辑和主流程脱节,需要单独手动drop,增加冗余操作
最优实现逻辑
全程使用Pandas内置的分组聚合能力完成匹配、合并、无效记录清理全流程,无需手动构建MultiIndex、逐行遍历:
- 以
LastName、DrugName、RxNumber三个字段为匹配键,划分所有记录的所属分组 - 自动过滤所有不存在正值配药记录的分组——这类分组就是没有对应匹配配药的孤立退款,直接从处理范围中移除,不需要单独drop
- 对剩余有效分组的所有数值列(
Amount、ClientTotalCost)做求和计算,自动将同组的配药和退款记录合并为单行
可直接运行的代码示例
import pandas as pd # 构造与业务场景一致的测试数据,其中BROWN的记录为无对应配药的孤立退款 raw_pbm_data = pd.DataFrame({ 'LastName': ['ADAMS', 'ADAMS', 'SMITH', 'BROWN'], 'DrugName': ['Drug', 'Drug', 'Drug', 'Drug'], 'RxNumber': [100001, 100001, 100002, 100003], 'Amount': [30, -25, 10, -5], 'ClientTotalCost': [10.69, -8.95, 15.2, -3.1] }) # 定义匹配分组的键列 match_cols = ['LastName', 'DrugName', 'RxNumber'] # 过滤无有效配药的孤立退款分组 valid_data = raw_pbm_data.groupby(match_cols).filter( lambda group: (group['Amount'] > 0).any() ) # 分组求和完成配药、退款记录的合并 result = valid_data.groupby(match_cols, as_index=False)[['Amount', 'ClientTotalCost']].sum()
注意:代码中的列名需要与实际业务数据的列名大小写完全匹配,比如原实现中写的
RXNumber如果和数据里的RxNumber大小写不一致,会触发KeyError。
输出结果校验
运行代码后得到的结果完全符合业务规则:
- ADAMS的同处方正负记录合并后:
Amount=5、ClientTotalCost=1.74,与样例预期一致 - 无退款的正常配药记录(SMITH条目)会完整保留
- 无对应配药的孤立退款记录(BROWN条目)会被自动过滤,不会出现在最终结果中
内容的提问来源于stack exchange,提问作者Jake Halopoff
相关产品推荐
相关产品推荐

