python - 使用子节点解析 xml 并创建 Pandas 数据框
问题描述
我有以下xml格式:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<run>
<information>
<logfile>s.log</logfile>
<version>33</version>
<mach>1</mach>
<problemname>mm1</problemname>
<timestamp>20201218.165122.053486</timestamp>
</information>
<controls>
<item>VARS</item>
</controls>
<result>
<status>4</status>
<time>3</time>
<obj>1.0</obj>
<gap>0.15</gap>
</result>
</run>
</results>
在阅读这篇文章后,我有一个示例代码来解析这个文件如何将 XML 文件转换为漂亮的熊猫数据框?,但它返回无。但是,我的问题是,是否有一种快速的方法来创建一个数据框,该数据框包含来自(即 VARS)值和 4 列(即状态、时间、obj 和间隙)的索引。
import pandas as pd
from xml.etree import ElementTree as et
root = (et.parse('test.xml').getroot()).getchildren()
tags = {"tags":[]}
for elem in root:
tag = {}
tag["status"] = elem.attrib['status']
tag["time"] = elem.attrib['time']
tag["obj"] = elem.attrib['obj']
tag["gap"] = elem.attrib['gap']
tags["tags"]. append(tag)
df_users = pd.DataFrame(tags["tags"])
df_users.head()
这是我正在寻找的输出:
status time obj gap
VARS 4 3 1.0 0.15
解决方案
我们可以使用findall
和find
的方法ElementTree
来提取我们需要的元素(result
作为列的子元素和controls/item
作为索引的元素):
pd.DataFrame({x.tag: x.text for x in et.findall('./run/result//')},
index = [et.find('./run/controls/item').text])
输出:
status time obj gap
VARS 4 3 1.0 0.15
推荐阅读
- c - Linux信号父子[c]
- android - 三星 Galaxy s9 能否将其操作系统从 10 升级到 11?
- nginx - nginx 上 docker 中的 Wordpress - 502 Bad Gateway
- javascript - Prisma with Next-Auth,用户创建失败导致Keycloak的api响应键名
- python-3.x - 安装 Wordcloud for Python 等包:要安装哪些工具?
- python - 如何添加十六进制字符串列表以获得总十六进制值
- jenkins - 参数化远程触发器正在阻止作业,直到远程作业被触发
- c++ - C ++在没有其他库的位图图像上绘制文本
- azure-cosmosdb - Azure Cosmos + EF Core 3.1 问题与 LocaView.Remove 和后续 Context.SaveChangeAsync()
- php - 检查字符串是否包含 2 个数组中的值