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

如何使用FOR LOOP将关联DataFrame转换为指定结构的XML文件

解决方案

代码实现

首先导入所需库,然后按指定XML结构循环生成节点并写入文件:

import pandas as pd
import xml.etree.ElementTree as ET
from xml.dom import minidom

# 假设已读取5个DataFrame:admission、PrimaryDiagnosis、otherReason、operationOrProcedure、dailyIntervention

# 创建XML根节点
root = ET.Element("dataroot")

# 遍历admission表的每个adNo记录
for _, adm_row in admission.iterrows():
    ad_no = adm_row["adNo"]
    
    # 创建Episode节点
    episode = ET.SubElement(root, "Episode")
    
    # 生成admission节点及子元素
    adm_node = ET.SubElement(episode, "admission")
    for col, val in adm_row.items():
        child = ET.SubElement(adm_node, col)
        child.text = str(val) if pd.notna(val) else ""  # 处理空值
    
    # 生成diagnosesAndProcedures父节点
    diag_proc_node = ET.SubElement(episode, "diagnosesAndProcedures")
    
    # 添加primaryDiagnosis子节点
    for _, pd_row in PrimaryDiagnosis[PrimaryDiagnosis["adNo"] == ad_no].iterrows():
        pd_node = ET.SubElement(diag_proc_node, "primaryDiagnosis")
        for col, val in pd_row.items():
            child = ET.SubElement(pd_node, col)
            child.text = str(val) if pd.notna(val) else ""
    
    # 添加otherReason子节点
    for _, or_row in otherReason[otherReason["adNo"] == ad_no].iterrows():
        or_node = ET.SubElement(diag_proc_node, "otherReason")
        for col, val in or_row.items():
            child = ET.SubElement(or_node, col)
            child.text = str(val) if pd.notna(val) else ""
    
    # 添加operationOrProcedure子节点
    for _, op_row in operationOrProcedure[operationOrProcedure["adNo"] == ad_no].iterrows():
        op_node = ET.SubElement(diag_proc_node, "operationOrProcedure")
        for col, val in op_row.items():
            child = ET.SubElement(op_node, col)
            child.text = str(val) if pd.notna(val) else ""
    
    # 生成dailyInterventions父节点
    daily_int_node = ET.SubElement(episode, "dailyInterventions")
    
    # 添加dailyIntervention子节点
    for _, d_row in dailyIntervention[dailyIntervention["adNo"] == ad_no].iterrows():
        d_node = ET.SubElement(daily_int_node, "dailyIntervention")
        for col, val in d_row.items():
            child = ET.SubElement(d_node, col)
            child.text = str(val) if pd.notna(val) else ""

# 格式化XML并写入文件
rough_xml = ET.tostring(root, "utf-8")
formatted_xml = minidom.parseString(rough_xml).toprettyxml(indent="  ")

with open("patient_episodes.xml", "w", encoding="utf-8") as f:
    f.write(formatted_xml)

关键说明

  1. 节点顺序严格匹配:按照<admission>→<diagnosesAndProcedures>→<dailyInterventions>的顺序生成Episode下的父节点,子节点也严格遵循要求的顺序。
  2. 空值处理:通过pd.notna(val)判断,将缺失值转为空字符串,避免XML中出现"nan"字样。
  3. 关联匹配:通过adNo过滤各关联表的记录,确保每个Episode只包含当前adNo对应的所有关联数据。
  4. XML格式化:使用minidom将生成的XML格式化,提升可读性。

内容的提问来源于stack exchange,提问作者Mahmow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:27:39