将 XML 文件转换为 Pandas DataFrame
Luqman Khan
2023年1月30日
2022年5月16日
本教程将介绍如何将 XML 文件转换为 Python Pandas DataFrame。我们将使用 xml.etree.ElementTree
库。
将 XML 文件转换为 Pandas DataFrame
XML 是一种标记语言,用于表达和传播有时难以使用更传统的表格格式生成的数据结构。
以下是将 XML 文件转换为 Pandas DataFrame 的步骤。
创建 XML 文件
<data>
<student name="John">
<email>john@mail.com</email>
<grade>A</grade>
<age>16</age>
</student>
<student name="Alice">
<email>alice@mail.com</email>
<grade>B</grade>
<age>17</age>
</student>
<student name="Bob">
<email>bob@mail.com</email>
<grade>C</grade>
<age>16</age>
</student>
<student name="Hannah">
<email>hannah@mail.com</email>
<grade>A</grade>
<age>17</age>
</student>
</data>
在此示例中,每个学生都由一个具有包含学生姓名的 name 属性的 <student>
元素表示。
这些元素中的每一个都进一步细分为由 <email>
、<grade>
和 <age>
标签定义的子元素,实际数据内容指的是给定学生的落在这些标签之间。
假设此数据保存在名为 students.xml
的 XML 文件中。
import xml.etree.ElementTree as et
xtree = et.parse("/content/drive/MyDrive/ABC/student.xml")
xroot = xtree.getroot()
在树上循环
我们现在可以遍历树,获取每个学生元素、它的 name 属性和它的子元素来生成我们的 DataFrame。
for node in xroot:
s_name = node.attrib.get("name")
s_mail = node.find("email").text
s_grade = node.find("grade").text
s_age = node.find("age").text
attrib.get()
函数用于获取名称属性,而每个元素的文本内容可以使用节点的 find()
函数获取。
每次迭代都会产生一个数据集,该数据集可以被视为 Pandas DataFrame 中的一个观察值。这个过程可以构建如下:
import pandas as pd
import xml.etree.ElementTree as et
xtree = et.parse("/content/drive/MyDrive/ABC/student.xml")
xroot = xtree.getroot()
df_cols = ["name", "email", "grade", "age"]
rows = []
for node in xroot:
s_name = node.attrib.get("name")
s_mail = node.find("email").text if node is not None else None
s_grade = node.find("grade").text if node is not None else None
s_age = node.find("age").text if node is not None else None
rows.append({"name": s_name, "email": s_mail,
"grade": s_grade, "age": s_age})
out_df = pd.DataFrame(rows, columns = df_cols)
使用这种技术的缺点是你必须提前知道 XML 文件的结构并相应地硬编码列名。我们可以尝试将这段代码修改为更实用、适应性更强的函数,不需要任何硬编码值:
out_df
当我们对 students.xml
文件使用解析 XML("students.xml", ["name", "email", "grade", "age"])
时,我们得到如下所示的表格。
name email grade age
0 John john@mail.com A 16
1 Alice alice@mail.com B 17
2 Bob bob@mail.com C 16
3 Hannah hannah@mail.com A 17
结论
虽然我们仍然需要知道我们希望解析的输入 XML 文档的基本结构,但这是一种更有效的 XML 解析功能实现。