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

如何在Python中使用Pandas从CSV文件的XML列提取信息并生成结构化DataFrame

解决方案:从CSV的XML列提取数据并合并到Pandas DataFrame

你的思路完全正确——单独处理XML列再和原DataFrame合并,这是处理这种混合格式数据的高效方式。下面是具体的实现步骤和代码:

1. 导入依赖库

我们需要用Pandas处理CSV,用Python标准库的xml.etree.ElementTree解析XML(如果需要更复杂的XML处理,也可以用lxml,但标准库足够应对你的场景):

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

2. 定义XML解析函数

由于你的XML带有默认命名空间(xmlns="http://data"),解析时必须指定命名空间才能正确定位元素。我们写一个函数,输入XML字符串,输出提取后的字段字典:

def parse_xml(xml_str):
    # 定义命名空间映射,前缀可以随便取,这里用'd'代表默认命名空间
    ns = {'d': 'http://data'}
    
    try:
        # 解析XML字符串
        root = ET.fromstring(xml_str)
        
        # 逐层定位元素:Type -> Person -> City
        person = root.find('d:Person', ns)
        city = person.find('d:City', ns)
        
        # 提取需要的字段
        extracted_data = {
            'City_Nr': city.find('d:Nr', ns).text,
            'City_Description': city.find('d:Description', ns).text,
            'City_Date': city.find('d:Date', ns).text,
            # 如果需要提取Details里的字段,继续添加:
            'Details_Name': person.find('d:Details/d:Name', ns).text,
            'Details_Account': person.find('d:Details/d:Account', ns).text,
            'Details_Status': person.find('d:Details/d:Status', ns).text
        }
        
        return extracted_data
    except Exception as e:
        # 处理XML解析错误,返回空字典或默认值
        print(f"解析XML出错: {e}")
        return {}

3. 读取CSV并处理XML列

先读取你的CSV文件(注意你用的分隔符是|,要保持一致),然后用apply方法把解析函数应用到Request列上,生成新的DataFrame:

# 读取原CSV
df = pd.read_csv('my_file.csv', header=0, sep='|', error_bad_lines=False)

# 解析XML列,生成提取后的DataFrame
xml_extracted = df['Request'].apply(lambda x: pd.Series(parse_xml(x)))

# 合并原DataFrame和提取后的DataFrame
final_df = pd.concat([df.drop('Request', axis=1), xml_extracted], axis=1)

4. 查看结果

现在final_df就是你想要的格式,包含原ID、Name列,加上从XML中提取的所有字段:

print(final_df.head())

输出示例:

ID   Name City_Nr City_Description          City_Date Details_Name Details_Account Details_Status
0  4223  Axery    5050              Big  2012-10-30T00:00:00Z       London           5050           Open
1  4001    Jix    5024              Big  2012-10-30T00:00:00Z       London           5024           Open
2  4067    AOe    5011              Big  2012-10-30T00:00:00Z       London           5011           Open

注意事项

  • 如果XML里有更多层级的字段,只需要在parse_xml函数里按照父元素/子元素的路径继续添加即可
  • 对于可能存在缺失的字段,可以在find方法后加判断,比如city.find('d:Nr', ns).text if city.find('d:Nr', ns) is not None else None
  • 如果XML数据量很大,apply可能会有点慢,这时可以考虑用批量解析的方式优化,比如用swifter库加速apply操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 10:02:46