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

基于Pandas行值构建MultiIndex实现配药正负行匹配、合并及无效退款清理

Pandas配药/退款记录匹配合并实现方案

原实现代码的核心问题

  • 列选取语法错误:.loc取多列时需将列名放入列表传入,直接拼接列名会触发行索引定位逻辑,直接报错
  • 逐行遍历匹配效率极低,且容易因为同姓名下不同处方号的记录交叉出现匹配错位
  • 依赖shift(1)判断退款的逻辑,要求退款记录必须紧跟在对应配药记录之后,无法适配业务数据顺序打乱的真实场景
  • 无效退款记录的清理逻辑和主流程脱节,需要单独手动drop,增加冗余操作

最优实现逻辑

全程使用Pandas内置的分组聚合能力完成匹配、合并、无效记录清理全流程,无需手动构建MultiIndex、逐行遍历:

  1. 以LastName、DrugName、RxNumber三个字段为匹配键,划分所有记录的所属分组
  2. 自动过滤所有不存在正值配药记录的分组——这类分组就是没有对应匹配配药的孤立退款,直接从处理范围中移除,不需要单独drop
  3. 对剩余有效分组的所有数值列(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 22:54:02