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

求助:基于正则表达式匹配合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:11:09