W artykule opiszę jak wczytać dane z pliku XML do obiektu DataFrame przy użyciu modułu xml.etree.ElementTree.
Pliki projektu są do pobrania: >>tutaj<<
Przykładowy plik XML będzie opisywał osoby zatrudnione w firmie i będzie miał następującą postać:
<persons>
<person id="">
<position></position>
<first_name></first_name>
<last_name></last_name>
<email></email>
<salary></salary>
</person>
</persons>
Dla każdej osoby, która posiada unikalny atrybut id zapisane są następujące dane: stanowisko, imię, nazwisko, email i wynagrodzenie.
Na początek importuję niezbędne moduły tj. xml.etree.ElementTree do parsowania dokumentu XML. Z modułu collections importuję defaultdict, który będzie przechowywał listy zawierające imiona, nazwiska , wynagrodzenia itd., który to słownik podaję następnie jako argument klasy DataFrame.
import xml.etree.ElementTree as et
from collections import defaultdict
import pandas as pd
W kolejnym wierszu tworzę słownik, który będzie przechowywał dane o pracownikach pozyskane z pliku XML:
persons = defaultdict(list)
Następnie wczytuję plik XML i pobieram element nadrzędny – root – persons, a następnie dla każdego elementu podrzędnego – person pobieram wartość jego atrybutu id, a także wartości jego elementów: position, first_name, last_name itd. Każda z tych wartości jest dodawana jako kolejny element odpowiedniej listy słownika.
tree = et.parse("persons.xml")
root = tree.getroot()
for child in root:
id = child.attrib.get('id')
position = child.find('position').text
first_name = child.find('first_name').text
last_name = child.find('last_name').text
email = child.find('email').text
salary = child.find('salary').text
persons['id'].append(id)
persons['position'].append(position)
persons['first_name'].append(first_name)
persons['last_name'].append(last_name)
persons['email'].append(email)
persons['salary'].append(salary)
Tak utworzony słownik podaję jako argument do tworzonego obiektu ramki, przy czym jako nazwy kolumn podaję nazwy kluczy słownika, a jako indeks ramki podaję kolumnę id.
Następnie typ danych kolumny salary zmieniam na float, aby posortować ramkę względem malejących wartości z tej kolumny. Ewentualnie konwersji na float można by dokonać przy tworzeniu obiektu DataFrame podając dodatkowo argument dtype.