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

匹配两个DataFrame的Drug_Code,实现Pat_ID维度的计数与列合并

问题解决:基于Drug_Code匹配的DataFrame分组聚合处理

需求说明

现有两个DataFrame(df1和df2),需完成以下操作:

  • 筛选出df1中Drug_Code与df2中Drug_Code匹配的记录
  • 按Pat_ID分组:
    1. 将同一Pat_ID对应的Date(保留所有出现值)、去重后的Drug_Code、对应df2的标准Drug_Names用逗号合并
    2. 新增Count列,统计每个Pat_ID下匹配到的不同Drug_Code数量

示例数据

df1

Pat_ID       Date       Drug_Code     Drug_Names
1         2010-12-09     1.1.1          Alpha-21
1         2010-12-15     1.1.2          Alpha
1         2010-12-15     1.1.3          Beta
1         2010-12-15     1.1.3          Beta-29
2         2010-12-09     1.1.3          Beta
2         2010-12-17     1.1.4          Beta-32
1         2010-12-15     1.1.3          Beta
3         2011-02-09     1.2.1          Gamma-21
3         2011-04-25     1.2.2          Gamma
3         2011-04-25     1.3.1          Tango

df2

Drug_Code     Drug_Names
1.1.1           Alpha-21
1.1.2           Alpha
1.1.3           Beta
1.1.4           Beta-2
1.2.1           Gamma-21
1.2.2           Gamma
1.3.1           Tango

目标结果

Pat_ID  Date                                 Drug_Code            Drug_Names           Count
1       2010-12-09, 2010-12-15, 2010-12-15, 2010-12-15   1.1.1, 1.1.2, 1.1.3  Alpha-21,Alpha,Beta    3                                         
2       2010-12-09, 2010-12-17               1.1.3, 1.1.4         Beta,Beta-2            2            
3       2011-02-09, 2011-04-25, 2011-04-25   1.2.1, 1.2.2, 1.3.1  Gamma-21,Gamma,Tango   3

解决方案(Pandas)

import pandas as pd

# 构建示例DataFrame
df1 = pd.DataFrame({
    'Pat_ID': [1,1,1,1,2,2,1,3,3,3],
    'Date': ['2010-12-09','2010-12-15','2010-12-15','2010-12-15','2010-12-09','2010-12-17','2010-12-15','2011-02-09','2011-04-25','2011-04-25'],
    'Drug_Code': ['1.1.1','1.1.2','1.1.3','1.1.3','1.1.3','1.1.4','1.1.3','1.2.1','1.2.2','1.3.1'],
    'Drug_Names': ['Alpha-21','Alpha','Beta','Beta-29','Beta','Beta-32','Beta','Gamma-21','Gamma','Tango']
})

df2 = pd.DataFrame({
    'Drug_Code': ['1.1.1','1.1.2','1.1.3','1.1.4','1.2.1','1.2.2','1.3.1'],
    'Drug_Names': ['Alpha-21','Alpha','Beta','Beta-2','Gamma-21','Gamma','Tango']
})

# 1. 筛选df1中与df2 Drug_Code匹配的记录
matched_records = df1[df1['Drug_Code'].isin(df2['Drug_Code'])]

# 2. 定义分组聚合逻辑
def group_aggregation(group):
    # 合并所有出现的日期
    merged_date = ', '.join(group['Date'].astype(str))
    # 去重后获取唯一Drug_Code
    unique_codes = group['Drug_Code'].unique()
    # 合并去重后的Drug_Code
    merged_code = ', '.join(unique_codes)
    # 从df2中获取标准Drug_Names并合并
    merged_names = ', '.join(df2[df2['Drug_Code'].isin(unique_codes)]['Drug_Names'].tolist())
    # 统计不同药物数量
    drug_count = len(unique_codes)
    
    return pd.Series([merged_date, merged_code, merged_names, drug_count],
                     index=['Date', 'Drug_Code', 'Drug_Names', 'Count'])

# 3. 按Pat_ID分组并应用聚合函数
result = matched_records.groupby('Pat_ID').apply(group_aggregation).reset_index()

print(result)

代码说明

  • 筛选匹配记录:通过isin()方法快速过滤出符合Drug_Code匹配条件的记录
  • 分组聚合:自定义函数处理每个分组内的字段合并与统计,确保Drug_Code去重后再计算数量和合并名称,保证结果准确性
  • 索引重置:将分组后的层级索引转换为普通列,与目标格式对齐

内容的提问来源于stack exchange,提问作者Usman YousafZai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:14:55