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

如何合并含重复键的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:05:13