将 XML 文件转换为 Pandas DataFrame

Luqman Khan 2023年1月30日
  1. 将 XML 文件转换为 Pandas DataFrame
  2. 结论
将 XML 文件转换为 Pandas DataFrame

本教程将介绍如何将 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 解析功能实现。

相关文章 - Pandas DataFrame