匹配两个DataFrame的Drug_Code,实现Pat_ID维度的计数与列合并
问题解决:基于Drug_Code匹配的DataFrame分组聚合处理
需求说明
现有两个DataFrame(df1和df2),需完成以下操作:
- 筛选出df1中
Drug_Code与df2中Drug_Code匹配的记录 - 按
Pat_ID分组:- 将同一
Pat_ID对应的Date(保留所有出现值)、去重后的Drug_Code、对应df2的标准Drug_Names用逗号合并 - 新增
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
相关产品推荐
相关产品推荐

