Извлечение XML во фрейм данных с родительским атрибутом в качестве заголовка столбца
У меня есть тысячи файлов XML, которые я буду обрабатывать, и они имеют схожий формат, но разные имена родителей и разное количество родителей. Через книги, Google, учебные пособия и просто пробуя коды, я смог извлечь все эти данные. Смотрите, например:При разборе фрейма данных xml на pandas возникает ошибка памяти а такжеДинамический поиск по атрибутам xml с использованием lxml и xpath в python
Тем не менее, я понял, что плохо извлекал данные, с дочерним «временем», повторяемым для каждого родителя.
Вот что я пытаюсь получить.
Time blah abc
1200 100 2
1300 30 4
1400 70 2
Вот что я знаю, как получить. Но мой текущий метод неуклюжий (я покажу ниже пример XML)
child Time grandchild
0 blah 1200 100
1 blah 1300 30
...
n-2 abc 1200 2
n-1 abc 1300 4
n abc 1400 2
Пример формата XML
<outer>
<inner>
<parent name = "blah" id = "1">
<child Time = "1200">
<grandchild>100</grandchild>
</child>
<child Time = "1300">
<grandchild>30</grandchild>
</child>
<child Time = "1400">
<grandchild>70</grandchild>
</child>
</parent>
<parent name = "abc" id = "2">
<child Time = "1200">
<grandchild>2</grandchild>
</child>
<child Time = "1300">
<grandchild>4</grandchild>
</child>
<child Time = "1400">
<grandchild>2</grandchild>
</child>
</parent>
<parent name = "1234" id = "7734">
<other> 12 </other>
</parent>
</inner>
</outer>
Вот как я могу получить мой вывод:
from lxml import etree, objectify
from pandas import *
dTime=[]
dparent = []
dgrandchild=[]
for df in root.xpath('/*/*/*/parent/child'):
dparent.append(df.getparent().attrib['name'])
## Iterate over attributes of time for specific parent
for attrib in df.attrib:
dTime.append(df.attrib[attrib])
## grandchild is a child of time, and iterate
subfields = df.getchildren()
for subfield in subfields:
dgrandchild.append(subfield.text)
df=DataFrame({'Parent': dparent,'Time':dTime,'grandchild':dgrandchld})
Я мог бы просто взять этот результат и изменить его, но это кажется неэффективным и очень неуклюжим подходом.
Я думаю, что мне нужно что-то из аромата:
#this does not work
data = []
for elem in root.xpath('/*/*/*/parent/child'):
elem_data = {}
for attrib in elem.attrib:
elem_data['Time'] = elem.attrib[attrib])
for child in elem.getchildren():
elem_data[getparent().attrib['name'])] = child.text
data.append(elem_data)
ndata = DataFrame(data)