求助:基于正则表达式匹配合并Pandas DataFrame列的实现方法
基于正则表达式匹配Pandas DataFrame并追加列
需求说明
有两个Pandas DataFrame,需要基于正则匹配将df1的code列值追加到df2的对应行中:当df1的code(如R93.2)与df2的ICD_CODE(如R93.1)的主码前缀匹配时,将df1的code值关联到df2的该行,并保留匹配后的结果行。
示例数据
df1
code R93.2 S03
df2
ICD_CODE ICD_term MDR_code MDR_term R93.1 Acute abdomen 10000647 Acute abdomen K62.4 Stenosis of anus and rectum 10002581 Anorectal stenosis S03.1 Hand-Schüller-Christian disease 10053135 Hand-Schueller-Christian disease
期望输出
code ICD_CODE ICD_term MDR_code MDR_term R93.2 R93.1 Acute abdomen 10000647 Acute abdomen S03 S03.1 Hand-Schüller-Christian disease 10053135 Hand-Schueller-Christian disease
解决方案
以下提供两种实现方式,均能达到需求效果:
方法1:提取主码后合并
通过提取code和ICD_CODE的主码(小数点前的部分)进行匹配合并,逻辑清晰易维护:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({'code': ['R93.2', 'S03']}) df2 = pd.DataFrame({ 'ICD_CODE': ['R93.1', 'K62.4', 'S03.1'], 'ICD_term': ['Acute abdomen', 'Stenosis of anus and rectum', 'Hand-Schüller-Christian disease'], 'MDR_code': ['10000647', '10002581', '10053135'], 'MDR_term': ['Acute abdomen', 'Anorectal stenosis', 'Hand-Schueller-Christian disease'] }) # 提取主码(小数点前的部分) df1['main_code'] = df1['code'].str.split('.').str[0] df2['main_code'] = df2['ICD_CODE'].str.split('.').str[0] # 基于主码合并,仅保留匹配行 merged_df = pd.merge(df2, df1, on='main_code', how='inner') # 调整列顺序并移除临时主码列 result = merged_df[['code', 'ICD_CODE', 'ICD_term', 'MDR_code', 'MDR_term']] print(result)
方法2:正则匹配关联
如果需要更灵活的正则规则(比如支持复杂前缀匹配),可以使用re模块结合apply实现:
import pandas as pd import re # 构造示例数据(同方法1) df1 = pd.DataFrame({'code': ['R93.2', 'S03']}) df2 = pd.DataFrame({ 'ICD_CODE': ['R93.1', 'K62.4', 'S03.1'], 'ICD_term': ['Acute abdomen', 'Stenosis of anus and rectum', 'Hand-Schüller-Christian disease'], 'MDR_code': ['10000647', '10002581', '10053135'], 'MDR_term': ['Acute abdomen', 'Anorectal stenosis', 'Hand-Schueller-Christian disease'] }) # 定义正则匹配函数 def find_matching_code(icd_code, code_list): for code in code_list: # 构造正则:匹配ICD_CODE以当前code的主码开头 main_code = code.split('.')[0] pattern = f"^{re.escape(main_code)}" if re.match(pattern, icd_code): return code return None # 为df2匹配对应的code df2['code'] = df2['ICD_CODE'].apply(lambda x: find_matching_code(x, df1['code'].tolist())) # 过滤无匹配的行并调整列顺序 result = df2.dropna(subset=['code'])[['code', 'ICD_CODE', 'ICD_term', 'MDR_code', 'MDR_term']] print(result)
两种方法运行后都将输出符合期望的结果。
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

