如何将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:
| KEY | date | ind1 | ind2 |
|---|---|---|---|
| 1 | 2017-12-31 | 14 | 24 |
| 1 | 2015-12-31 | 10 | 20 |
| 1 | 2016-12-31 | 12 | 22 |
| 2 | 2017-12-31 | 0 | 0 |
| 2 | 2015-12-31 | 0 | 0 |
| 2 | 2016-12-31 | 0 | 0 |
注意事项
- 如果你的XML里有更多指标(比如
ind3到indN),这个代码也能自动识别并生成对应的列,不需要手动修改 - 如果XML里的字段有缺失值,解析后会显示为
NaN,你可以根据需求用fillna()处理 - 若XML字符串格式不规范,可能会导致解析错误,建议先检查XML的有效性
内容的提问来源于stack exchange,提问作者confused_pandas
相关产品推荐
相关产品推荐

