如何使用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)
关键说明
- 节点顺序严格匹配:按照
<admission>→<diagnosesAndProcedures>→<dailyInterventions>的顺序生成Episode下的父节点,子节点也严格遵循要求的顺序。 - 空值处理:通过
pd.notna(val)判断,将缺失值转为空字符串,避免XML中出现"nan"字样。 - 关联匹配:通过
adNo过滤各关联表的记录,确保每个Episode只包含当前adNo对应的所有关联数据。 - XML格式化:使用
minidom将生成的XML格式化,提升可读性。
内容的提问来源于stack exchange,提问作者Mahmow
相关产品推荐
相关产品推荐

