Python: извлечение XML в DataFrame (Панды) - PullRequest
0 голосов
/ 09 июня 2018

a имеют XML-файл, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<comments>
<row Id="1" PostId="2" Score="0" Text="(...)" CreationDate="2011-08-30T21:15:28.063" UserId="16" />
<row Id="2" PostId="17" Score="1" Text="(...)" CreationDate="2011-08-30T21:24:56.573" UserId="27" />
<row Id="3" PostId="26" Score="0" Text="(...)" UserId="9" />
</comments>

Я пытаюсь извлечь столбцы ID, Text и CreationDate в DF панд, и я попробовал следующее:

import xml.etree.cElementTree as et
import pandas as pd
path = '/.../...'
dfcols = ['ID', 'Text', 'CreationDate']
df_xml = pd.DataFrame(columns=dfcols)

root = et.parse(path)
rows = root.findall('.//row')
for row in rows:
    ID = row.find('Id')
    text = row.find('Text')
    date = row.find('CreationDate')
    print(ID, text, date)
    df_xml = df_xml.append(pd.Series([ID, text, date], index=dfcols), ignore_index=True)

print(df_xml)

Но вывод: Нет Нет Нет

Не могли бы вы рассказать, как это исправить?БЛАГОДАРЯ

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Как рекомендовано в этом решении золотым членом Python / pandas / numpy guru, @unutbu:

Никогда не вызывайте DataFrame.append или pd.concat внутри цикла for,Это приводит к квадратичному копированию.

Поэтому рассмотрите возможность разбора XML-данных в отдельный список, а затем передайте список в конструктор DataFrame за один вызов вне цикла.На самом деле, вы можете передавать вложенные списки со списком непосредственно в конструктор:

path = 'AttributesXMLPandas.xml'
dfcols = ['ID', 'Text', 'CreationDate']

root = et.parse(path)
rows = root.findall('.//row')

# NESTED LIST
xml_data = [[row.get('Id'), row.get('Text'), row.get('CreationDate')] 
            for row in rows]

df_xml = pd.DataFrame(xml_data, columns=dfcols)

print(df_xml)

#   ID   Text             CreationDate
# 0  1  (...)  2011-08-30T21:15:28.063
# 1  2  (...)  2011-08-30T21:24:56.573
# 2  3  (...)                     None
0 голосов
/ 09 июня 2018

Небольшое изменение в вашем коде

ID = row.get('Id')
text = row.get('Text')
date = row.get('CreationDate')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...