Конвертировать список xmls в DataFrame - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть список xmls, предположим, что:

    xmls = [
   '<note>
    <to>John</to>
    <from>Janet</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>',
    '<note>
    <to>Tom</to>
    <from>Jennifer</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
    </note>'
]

Я хотел бы превратить этот список в Pandas фрейм данных, подобный этому:

to          from             heading             body
John        Janet            Reminder            Don't forget me this weekend!
Tom         Jennifer         Reminder            Don't forget me this weekend!

Спасибо большое много!

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Вы можете попробовать xmltodict , поскольку это может упростить для вас обработку:

  res = [
          {key: [value]
          for key, value
          #parses the data into a json like format
          #which u can manipulate like a python dict
          in xmltodict.parse(xml)["note"].items()} 
          for xml in xmls
         ]

 print(res)

 [{'to': ['John'],
   'from': ['Janet'],
   'heading': ['Reminder'],
   'body': ["Don't forget me this weekend!"]},
 {'to': ['Tom'],
  'from': ['Jennifer'],
  'heading': ['Reminder'],
  'body': ["Don't forget me this weekend!"]}]

#merge dictionaries into one dataframe
pd.concat([pd.DataFrame(entry) for entry in res])


    to      from        heading                     body
0   John    Janet      Reminder     Don't forget me this weekend!
0   Tom     Jennifer    Reminder    Don't forget me this weekend!
1 голос
/ 03 апреля 2020

Вы можете использовать xml.etree.ElementTree модуль. Сначала выполните итерацию по списку XML и проанализируйте необходимые поля. Затем создайте словарь с ключами в качестве имени столбца и значениями в виде строк. Затем передайте этот словарь классу pd.DataFrame, чтобы создать DataFrame.

>>> import pandas as pd
>>> import xml.etree.ElementTree as ET
>>> from pprint import pprint
>>> 
>>> xmls = [
...     """<note>
... <to>John</to>
... <from>Janet</from>
... <heading>Reminder</heading>
... <body>Don't forget me this weekend!</body>
... </note>""",
...     """<note>
... <to>Tom</to>
... <from>Jennifer</from>
... <heading>Reminder</heading>
... <body>Don't forget me this weekend!</body>
... </note>""",
... ]
>>> 
>>> fields = {}
>>> for i in xmls:
...     root = ET.fromstring(i)
...     for child in root:
...         fields.setdefault(child.tag, []).append(child.text)
... 
>>> pprint(fields)
{'body': ["Don't forget me this weekend!", "Don't forget me this weekend!"],
 'from': ['Janet', 'Jennifer'],
 'heading': ['Reminder', 'Reminder'],
 'to': ['John', 'Tom']}
>>> df = pd.DataFrame(fields)
>>> df
     to      from   heading                           body
0  John     Janet  Reminder  Don't forget me this weekend!
1   Tom  Jennifer  Reminder  Don't forget me this weekend!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...