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

如何将DataFrame生成的Python字典转换为指定层级结构的XML?

解决DataFrame转字典后生成指定结构XML的问题

问题背景

现有如下结构的DataFrame:

Column AColumn B
getTitlestatus
getTitletimestamp
submitBooktitle
submitBookdate
submitBooknumPages

通过以下代码将其转换为目标字典:

book_dict = df.groupby(['Column A'])['Column B'].agg(list).to_dict()

得到的字典结构:

{'getTitle': ['status','timestamp'],
 'submitBook': ['title', 'date', 'numPages']}

原递归转换XML的代码会将列表直接作为节点文本内容,生成的XML不符合需求。期望生成的XML结构为:

<?xml version="1.0" ?>
<Books>
  <getTitle>
    <status></status>
    <timestamp></timestamp>
  </getTitle>
  <submitBook>
    <title></title>
    <date></date>
    <numPages></numPages>
  </submitBook>
</Books>

解决方案

修改递归函数,增加对值类型的判断:当值为列表时,遍历列表元素创建空的子节点;针对字典类型则递归处理键值对。

修改后的完整代码

import xml.etree.ElementTree as ET
import pandas as pd

# 构造示例DataFrame
data = {
    'Column A': ['getTitle', 'getTitle', 'submitBook', 'submitBook', 'submitBook'],
    'Column B': ['status', 'timestamp', 'title', 'date', 'numPages']
}
df = pd.DataFrame(data)

# 转换为目标字典
book_dict = df.groupby(['Column A'])['Column B'].agg(list).to_dict()

def create_tree(root, data):
    if isinstance(data, dict):
        for k, v in data.items():
            child_node = ET.SubElement(root, k)
            create_tree(child_node, v)
    elif isinstance(data, list):
        for item in data:
            ET.SubElement(root, item)
    return root

# 生成XML根节点并转换
root = ET.Element("Books")
create_tree(root, book_dict)

# 格式化XML缩进
ET.indent(root, space="  ", level=0)
tree = ET.ElementTree(root)

# 保存到文件或打印结果
tree.write("output.xml", encoding="utf-8", xml_declaration=True)
ET.dump(root)

输出结果

运行代码后生成的XML内容:

<?xml version='1.0' encoding='utf-8'?>
<Books>
  <getTitle>
    <status />
    <timestamp />
  </getTitle>
  <submitBook>
    <title />
    <date />
    <numPages />
  </submitBook>
</Books>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:42:49