如何合并含重复键的DataFrame?实现医疗数据宽表转换
如何将患者诊断码的多行数据合并为单行多列格式?
你用左连接得到重复患者行的问题很常见——因为左连接会把每个诊断码都对应到患者行上,导致行数翻倍。要实现你要的单行多列格式,得先把诊断码数据转成宽表,再和基础信息合并,具体步骤如下:
步骤1:构造示例数据
先把你的样本数据转换成Pandas DataFrame:
import pandas as pd df1 = pd.DataFrame({ "INC_KEY": [1,2,3], "SEX": ["F","F","M"], "AGE": [40,24,66] }) df2 = pd.DataFrame({ "INC_KEY": [1,1,2,3,2,3,1], "DCODE": ["BW241ZZ","BW28ZZZ","0BH17EZ","05H633Z","4A103BD","BR30ZZZ","BF42ZZZ"] })
步骤2:给每个患者的诊断码加序号
按INC_KEY分组,给每组内的诊断码分配从1开始的序号,用来生成DCODE1、DCODE2这类列名:
# 给每组内的诊断码编序号 df2["code_index"] = df2.groupby("INC_KEY").cumcount() + 1 # 生成目标列名 df2["code_col"] = "DCODE" + df2["code_index"].astype(str)
步骤3:把诊断码数据转成宽表
用pivot把同一患者的多个诊断码横向展开成列:
df2_wide = df2.pivot(index="INC_KEY", columns="code_col", values="DCODE").reset_index()
步骤4:合并基础数据并填充缺失值
最后把宽表和df1做左连接,缺失的诊断码位置填充为N/A:
final_result = df1.merge(df2_wide, on="INC_KEY", how="left").fillna("N/A")
运行后得到的final_result就是你要的格式:
INC_KEY SEX AGE DCODE1 DCODE2 DCODE3 0 1 F 40 BW241ZZ BW28ZZZ BF42ZZZ 1 2 F 24 0BH17EZ 4A103BD N/A 2 3 M 66 05H633Z BR30ZZZ N/A
关键细节
cumcount()会保留原df2里诊断码的顺序,不会打乱排序- 左连接确保df1里的所有患者行都被保留,哪怕某个患者没有诊断码(如果存在这种情况)
- 填充
N/A是为了统一格式,也可以根据需求换成NaN或其他占位符
内容的提问来源于stack exchange,提问作者Sean Roudnitsky
相关产品推荐
相关产品推荐

