如何在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
相关产品推荐
相关产品推荐

