將 XML 檔案轉換為 Pandas DataFrame
Luqman Khan
2023年1月30日
![將 XML 檔案轉換為 Pandas DataFrame](/img/Python-Pandas/feature-image---convert-xml-file-to-python-nice-pandas-dataframe.webp)
本教程將介紹如何將 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 解析功能實現。