如何用Pandas read_xml从两个XML父节点导入数据到DataFrame
解决XML导入Pandas时关联AgentID与Sale数据的问题
直接传入xpath列表['//AgentID', '//Sale']行不通,因为Pandas的read_xml对xpath列表的处理是读取多个独立节点集合并尝试合并,无法关联父子节点的对应关系。你可以通过以下两种方法实现需求:
方法一:利用elems_to_row参数自动关联
这是最简洁的方式,通过指定父节点//Sales,并设置elems_to_row='Sale',让Pandas将每个Sale子节点拆分为单独行,同时保留父节点下的AgentID:
import pandas as pd test_xml = '''<TEST_XML> <Sales> <AgentID>0001</AgentID> <Sale> <Location>0</Location> <Size>1000</Size> <Status>Available</Status> </Sale> <Sale> <Location>1</Location> <Size>500</Size> <Status>Unavailable</Status> </Sale> </Sales> </TEST_XML>''' df = pd.read_xml(test_xml, xpath='//Sales', elems_to_row='Sale') # 调整列顺序(可选) df = df[['AgentID', 'Location', 'Size', 'Status']]
运行后得到的DataFrame就是你期望的结果:
AgentID Location Size Status 0 0001 0 1000 Available 1 0001 1 500 Unavailable
方法二:手动提取AgentID后合并
如果需要更灵活的处理(比如多组Sales节点),可以分开提取数据再合并:
# 提取Sale节点数据 df_sales = pd.read_xml(test_xml, xpath='//Sale') # 提取AgentID值 agent_id = pd.read_xml(test_xml, xpath='//AgentID').iloc[0, 0] # 添加AgentID列并调整顺序 df_sales['AgentID'] = agent_id df_sales = df_sales[['AgentID', 'Location', 'Size', 'Status']]
这种方法适合需要对AgentID做额外处理的场景,比如循环处理多个Sales节点时,可以逐个提取对应AgentID并赋值给其下的Sale行。
内容的提问来源于stack exchange,提问作者marillion
相关产品推荐
相关产品推荐

