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

如何将DataFrame中的XML字符串列拆分展开为带指标列的多行结构化数据

如何展开DataFrame中的XML字符串为多列?

当然有办法实现这个需求!我来给你一步步拆解怎么把嵌套的XML字符串转换成你想要的扁平DataFrame结构:

核心思路

我们需要遍历DataFrame的每一行,解析其中的XML字符串,把每个<group>节点转换成一行数据,然后和原行的其他字段(比如KEY)合并,最后把所有结果拼接起来。

具体实现步骤

1. 导入所需库

我们需要用到pandas处理DataFrame,xml.etree.ElementTree解析XML,还有StringIO来把字符串当作文件对象传给XML解析器:

import pandas as pd
import xml.etree.ElementTree as ET
from io import StringIO

2. 编写XML解析函数

这个函数负责把单个XML字符串转换成包含所有<group>数据的小DataFrame:

def parse_xml(xml_str):
    # 将XML字符串转为可解析的文件对象
    tree = ET.parse(StringIO(xml_str))
    root = tree.getroot()
    
    # 收集每个<group>节点的数据
    group_data = []
    for group in root.findall('group'):
        row_dict = {}
        # 遍历group下的所有子节点,提取标签和文本内容
        for child in group:
            row_dict[child.tag] = child.text
        group_data.append(row_dict)
    
    # 转换为DataFrame返回
    return pd.DataFrame(group_data)

3. 处理原DataFrame并合并结果

接下来我们把原DataFrame的每一行和解析后的XML数据合并,再展开成目标结构:

# 先定义你的原DataFrame(用你提供的示例数据)
df = pd.DataFrame({
    'KEY': {0: 1, 1: 2},
    'INDICATORS': {
        0: '<?xml version="1.0"?>\n<row>\n <group>\n <date>2017-12-31</date>\n <ind1>14</ind1>\n <ind2>24</ind2>\n </group>\n <group>\n <date>2015-12-31</date>\n <ind1>10</ind1>\n <ind2>20</ind2>\n </group>\n <group>\n <date>2016-12-31</date>\n <ind1>12</ind1>\n <ind2>22</ind2>\n </group>\n</row>\n',
        1: '<?xml version="1.0"?>\n<row>\n <group>\n <date>2017-12-31</date>\n <ind1>0</ind1>\n <ind2>0</ind2>\n </group>\n <group>\n <date>2015-12-31</date>\n <ind1>0</ind1>\n <ind2>0</ind2>\n </group>\n <group>\n <date>2016-12-31</date>\n <ind1>0</ind1>\n <ind2>0</ind2>\n </group>\n</row>\n'
    }
})

# 遍历每一行,合并原字段和解析后的XML数据
expanded_df = df.apply(
    lambda row: pd.concat(
        [pd.DataFrame([row.drop('INDICATORS')]), parse_xml(row['INDICATORS'])],
        axis=1
    ),
    axis=1
).explode(list(parse_xml(df['INDICATORS'].iloc[0]).columns)).reset_index(drop=True)

# 可选:把指标列转换成数值类型(根据你的实际需求调整)
expanded_df[['ind1', 'ind2']] = expanded_df[['ind1', 'ind2']].astype(int)

# 查看结果
print(expanded_df)

4. 最终输出结果

运行上面的代码后,你会得到如下结构的DataFrame:

KEYdateind1ind2
12017-12-311424
12015-12-311020
12016-12-311222
22017-12-3100
22015-12-3100
22016-12-3100

注意事项

  • 如果你的XML里有更多指标(比如ind3到indN),这个代码也能自动识别并生成对应的列,不需要手动修改
  • 如果XML里的字段有缺失值,解析后会显示为NaN,你可以根据需求用fillna()处理
  • 若XML字符串格式不规范,可能会导致解析错误,建议先检查XML的有效性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:02:28