如何将多层标签XML转换为含上级节点属性的Pandas DataFrame?
解决XML转DataFrame时获取上级节点属性的问题
你的核心需求是把<pdv>节点的属性(id、latitude、longitude、city)和下属<price>节点的属性合并到同一个DataFrame里,仅用pd.read_xml("myfile.xml", xpath="//price")只能拿到price的数据,因为xpath只定位到了price节点,没关联上级pdv的信息。下面提供两种实用的解决方法:
方法一:手动遍历XML节点(灵活适配复杂结构)
通过xml.etree.ElementTree解析XML,逐个遍历<pdv>和下属的<price>节点,将两者的属性合并后再转成DataFrame:
import pandas as pd import xml.etree.ElementTree as ET # 解析XML文件 tree = ET.parse("myfile.xml") root = tree.getroot() # 存储所有行数据的列表 data_rows = [] # 遍历每个pdv节点 for pdv_node in root.findall(".//pdv"): # 提取pdv节点的核心属性 pdv_info = { "id": pdv_node.get("id"), "latitude": pdv_node.get("latitude"), "longitude": pdv_node.get("longitude"), "city": pdv_node.get("city") } # 遍历当前pdv下的所有price节点 for price_node in pdv_node.findall(".//price"): # 合并pdv属性和price属性,生成一行数据 row_data = pdv_info.copy() row_data.update(price_node.attrib) data_rows.append(row_data) # 转换为DataFrame df = pd.DataFrame(data_rows)
方法二:用pandas内置的xpath关联父节点属性(简洁高效)
直接通过pd.read_xml的xpath语法,从price节点向上关联父pdv的属性,一次性提取所有需要的字段:
import pandas as pd df = pd.read_xml( "myfile.xml", xpath="//price", # 若XML存在命名空间,需在这里指定,例如{"ns": "http://your-namespace-url"},同时xpath要改为//ns:price namespaces={}, attrs={ "pdv_id": "../@id", # 提取父pdv节点的id属性 "latitude": "../@latitude", "longitude": "../@longitude", "city": "../@city", "fuel": "@fuel", # 提取当前price节点的fuel属性 "value": "@value", "date": "@date" # 根据你的price节点实际属性调整字段 } )
注意事项
如果你的XML包含命名空间(例如开头有xmlns="http://xxx.com"),需要在namespaces参数中定义命名空间别名,同时xpath和属性路径要加上别名前缀,比如xpath="//ns:price"、"pdv_id": "../ns:@id"。
内容的提问来源于stack exchange,提问作者MG Fern
相关产品推荐
相关产品推荐

