如何将含XML的Pandas Series/DF单元格转换为多列?
解决方法
你的单元格里混杂了大量无效符号(比如|)和冗余文本,直接用ElementTree解析会因为格式不规范报错。下面是针对新手的分步实现方案,代码注释很详细:
1. 先模拟你的测试数据
先创建一个和你数据集结构一致的示例DataFrame,方便后续测试:
import pandas as pd # 模拟每个单元格的混乱XML文本 sample_data = { 'parameters': [ '''parameters |<data>| <parameters>| | <p num="1" value="0" /> | |<p num="2" value="0.0" />| |<p num="3" value="100.0" />| |<p num="4" value="2" />| |<p/>| |...| ||...| |<data/>|''', '''parameters |<data>| <parameters>| | <p num="1" value="5" /> | |<p num="2" value="3.5" />| |<p num="3" value="90.0" />| |<p num="4" value="7" />| |<p/>| |...| ||...| |<data/>|''' ] } df = pd.DataFrame(sample_data)
2. 编写参数提取函数
这个函数会先清理脏数据,再提取有效参数:
import re def parse_single_cell(cell_text): # 第一步:去掉所有多余的|符号 cleaned_text = cell_text.replace('|', '') # 第二步:用正则匹配所有带num和value的<p>标签 # 正则规则:精准匹配"<p num="数字" value="数值" />"格式的内容 param_pattern = re.compile(r'<p num="(\d+)" value="([\d.]+)" />') matched_params = param_pattern.findall(cleaned_text) # 把匹配结果转成字典,键为参数名(比如param_1),值转为数值类型 result_dict = {f'param_{num}': float(value) for num, value in matched_params} return result_dict
3. 批量处理整个DataFrame
把函数应用到parameters列的每个单元格,再将结果合并到原DataFrame:
# 对每个单元格执行提取操作,得到包含字典的Series extracted_params = df['parameters'].apply(parse_single_cell) # 把字典序列转成结构化的DataFrame params_df = pd.DataFrame(extracted_params.tolist()) # 和原数据合并,得到最终结果 final_result = pd.concat([df, params_df], axis=1) # 查看处理后的数据 print(final_result)
最终效果
处理后每个num="X"会变成单独的列(比如param_1),列值对应原value:
parameters param_1 param_2 param_3 param_4 0 parameters |<data>| <parameters>| | <p num="1" value="0" /> | ... 0.0 0.0 100.0 2.0 1 parameters |<data>| <parameters>| | <p num="1" value="5" /> | ... 5.0 3.5 90.0 7.0
补充说明
你之前用ElementTree失败,是因为原始文本里有大量不符合XML规范的内容(多余符号、不完整标签),ElementTree要求严格的XML格式,所以无法直接解析。用正则提取反而更适配这种混乱的场景。
内容的提问来源于stack exchange,提问作者Snive
相关产品推荐
相关产品推荐

