Extraindo XML no Quadro de Dados com o atributo pai como título da coluna
Eu tenho milhares de arquivos XML que estarei processando, e eles têm um formato similar, mas diferentes nomes de pais e diferentes números de pais. Através de livros, google, tutoriais e apenas experimentando códigos, consegui extrair todos esses dados. Veja, por exemplo:A análise do xml para o frame de dados do pandas gera um erro de memória ePesquisa dinâmica através de atributos xml usando lxml e xpath em python
No entanto, percebi que estava extraindo os dados mal, com um filho "Time" repetido para cada pai.
Aqui está o que estou tentando fazer.
Time blah abc
1200 100 2
1300 30 4
1400 70 2
Aqui está o que eu sei como chegar. Mas meu método atual é desajeitado (mostrarei abaixo o exemplo 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
Exemplo de formato 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>
Aqui está como posso obter minha saída:
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})
Eu poderia pegar essa saída e reformulá-la, mas isso parece ineficiente e uma abordagem muito desajeitada.
Eu acho que preciso de algo do sabor:
#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)