Синтаксический анализ xml в кадре данных pandas вызывает ошибку памяти

Я пытаюсь поставить 1. родительский атрибут 2. дочерний атрибут и 3. текст внука в фрейм данных. Я могу получить атрибут child и текст внука на экране, но я не могу заставить их перейти в фрейм данных. Я получаю ошибку памяти от панд.

Вот интро-материал

import requests from lxml import etree, objectify r = requests.get('https://api.stuff.us/place/getData? security_key=key&period=minutes&startTime=2013-05-01T00:00&endTime=2013-05-01T23:59&sort=channel') #edited for privacy root = etree.fromstring(r.text) xml_new = etree.tostring(root, pretty_print=True) print xml_new[300:900] #gives xml output to show structure <startTime>2013-05-01 00:00:00</startTime> <endTime>2013-05-01 23:59:00</endTime> <summaryPeriod>minutes</summaryPeriod> <data> <channel channel="97925" name="blah"> <Time Time="2013-05-01 00:00:00"> <value>258</value> </Time> <Time Time="2013-05-01 00:01:00"> <value>259</value> </Time> <Time Time="2013-05-01 00:02:00"> <value>258</value> </Time> <Time Time="2013-05-01 00:03:00"> <value>257</value> </Time> 

Это показывает, как я синтаксический анализ, чтобы получить атрибут child и внук для печати.

 for df in root.xpath('//channel/Time'): ## Iterate over attributes of channel/Time for attrib in df.attrib: print '@' + attrib + '=' + df.attrib[attrib] ## value is a child of time, and iterate subfields = df.getchildren() for subfield in subfields: print 'subfield=' + subfield.text 

Это дает очень длинную распечатку с запрошенной информацией:

 ... @Time=2013-05-01 23:01:00 value=100 @Time=2013-05-01 23:02:00 value=101 @Time=2013-05-01 23:03:00 value=99 @Time=2013-05-01 23:04:00 value=101 ... 

Однако, когда я пытаюсь поместить его в фрейм данных, я получаю ошибку памяти. Я попытался с ними обоими, просто попробовав получить дочерний атрибут в фрейм данных.

 data = [] for df in root.xpath('//channel/Time'): ## Iterate over attributes of channel/Time for attrib in df.attrib: el_data = {} el_data[attrib] = df.attrib[attrib] data.append(el_data) from pandas import * perf = DataFrame(data) perf --------------------------------------------------------------------------- MemoryError Traceback (most recent call last) <ipython-input-6-08c8c74f7192> in <module>() 1 from pandas import * ----> 2 perf = DataFrame(data) 3 perf /Users/user/Library/Enthought/Canopy_32bit/User/lib/python2.7/site- packages/pandas/core/frame.pyc in __init__(self, data, index, columns, dtype, copy) 417 418 if isinstance(data[0], (list, tuple, collections.Mapping, Series)): --> 419 arrays, columns = _to_arrays(data, columns, dtype=dtype) 420 columns = _ensure_index(columns) 421 /Users/user/Library/Enthought/Canopy_32bit/User/lib/python2.7/site-packages/pandas/core/frame.pyc in _to_arrays(data, columns, coerce_float, dtype) 5457 return _list_of_dict_to_arrays(data, columns, 5458 coerce_float=coerce_float, -> 5459 dtype=dtype) 5460 elif isinstance(data[0], Series): 5461 return _list_of_series_to_arrays(data, columns, /Users/user/Library/Enthought/Canopy_32bit/User/lib/python2.7/site- packages/pandas/core/frame.pyc in _list_of_dict_to_arrays(data, columns, coerce_float, dtype) 5521 for d in data] 5522 -> 5523 content = list(lib.dicts_to_array(data, list(columns)).T) 5524 return _convert_object_array(content, columns, dtype=dtype, 5525 coerce_float=coerce_float) /Users/user/Library/Enthought/Canopy_32bit/User/lib/python2.7/site-packages/pandas/lib.so in pandas.lib.dicts_to_array (pandas/lib.c:7657)() MemoryError: 

У меня есть 12960 значений «значение» в моем XML-файле. Я предполагаю, что эти ошибки памяти сообщают мне что-то о значениях в файле, не отвечающих ожидаемым, но это не соответствует ошибке памяти, и я не мог понять это из других вопросов SO относительно ошибок памяти или из pandas.

Попытка получить типы данных не дает никакой информации. Может быть, нет типов? Возможно, потому, что они являются элементами в дереве элементов. (Я пытался распечатать .pyval, но он только сказал мне, что атрибута нет.) El_data имеет тип "dict"

 print(objectify.dump(root))[700:1000] #print a subset of types name = 'zone' Time = None [_Element] * Time = '2013-05-01 00:00:00' value = '258' [_Element] Time = None [_Element] * Time = '2013-05-01 00:01:00' value = '259' [_Element] type(el_data) dict 

Я построил этот код на основе книги Python для анализа данных и других примеров, найденных в SO для синтаксического анализа XML. Я еще новичок в python.

Запуск Python 2.7.2 на Mac OS 10.7.5

  • Разбор файла с несколькими xmls в нем
  • Как я могу получить доступ к XML-элементам с именами, используя BeautifulSoup?
  • Обновление XML-элементов и значений атрибутов с использованием Python etree
  • Использование Python и lxml для проверки XML на внешний DTD
  • Код Python для удаления тегов HTML из строки
  • Есть ли переключатель для игнорирования неопределенных префиксов пространства имен в LXML?
  • Строки XML Unicode с объявлением кодировки не поддерживаются
  • Проверка XML (.xsd) на схему
  • One Solution collect form web for “Синтаксический анализ xml в кадре данных pandas вызывает ошибку памяти”

    Ответ основан на помощи Джеффа и ДжоКингтона. Данные необходимо было поместить в списки отдельно, прежде чем их вставлять в фреймворк данных. Ошибка памяти вызывалась несколькими «элементами», которые не могли быть помещены в фрейм данных. Вместо этого каждый элемент dict должен быть помещен в список, который может попасть в фрейм данных.

    Это работает:

     dTime=[] dvalue=[] for df in root.xpath('//channel/Time'): ## Iterate over attributes of channel for attrib in df.attrib: dTime.append(df.attrib[attrib]) ## value is a child of time, and iterate subfields = df.getchildren() for subfield in subfields: dvalue.append(subfield.text) pef=DataFrame({'Time':dTime,'values':dvalue}) pef &ltclass 'pandas.core.frame.DataFrame'&gt Int64Index: 12960 entries, 0 to 12959 Data columns (total 2 columns): Time 12960 non-null values value 12960 non-null values dtypes: object(2) pef[:5] Time value 0 2013-05-01 00:00:00 258 1 2013-05-01 00:01:00 259 2 2013-05-01 00:02:00 258 3 2013-05-01 00:03:00 257 4 2013-05-01 00:04:00 257 
    Python - лучший язык программирования в мире.