Извлечение XML в фрейм данных с родительским атрибутом в качестве заголовка столбца

У меня есть тысячи XML-файлов, которые я буду обрабатывать, и у них одинаковый формат, но разные родительские имена и разные числа родителей. Через книги, google, учебные пособия и просто проверять коды, я смог вытащить все эти данные. См., Например: Анализ xml в pandas data frame вызывает ошибку памяти и динамический поиск через атрибуты 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) 

One Solution collect form web for “Извлечение XML в фрейм данных с родительским атрибутом в качестве заголовка столбца”

Сначала я рекомендую только синтаксический анализ DataFrame, аналогичный тому, как вы уже (см. Ниже для моей реализации), а затем настраивая его на ваши требования.

Затем вы ищете pivot :

 In [11]: df Out[11]: child Time grandchild 0 blah 1200 100 1 blah 1300 30 2 abc 1200 2 3 abc 1300 4 4 abc 1400 2 In [12]: df.pivot('Time', 'child', 'grandchild') Out[12]: child abc blah Time 1200 2 100 1300 4 30 1400 2 NaN 

Я рекомендую сначала разобрать из файла и вынуть нужные вещи в список кортежей:

 from lxml import etree root = etree.parse(file_name) parents = root.getchildren()[0].getchildren() In [21]: elems = [(p.attrib['name'], int(c.attrib['Time']), int(gc.text)) for p in parents for c in p for gc in c] In [22]: elems Out[22]: [('blah', 1200, 100), ('blah', 1300, 30), ('blah', 1400, 70), ('abc', 1200, 2), ('abc', 1300, 4), ('abc', 1400, 2)] 

Для нескольких файлов вы можете просто ударить его в еще более длинном понимании списка. Который не должен быть слишком медленным, если у вас нет огромного количества xmls (здесь files – это список xmls) …

 elems = [(p.attrib['name'], int(c.attrib['Time']), int(gc.text)) for f in files for p in etree.parse(f).getchildren()[0].getchildren() for c in p for gc in c] 

Поместите их в DataFrame:

 In [23]: pd.DataFrame(elems, columns=['child', 'Time', 'grandchild']) Out[23]: child Time grandchild 0 blah 1200 100 1 blah 1300 30 2 blah 1400 70 3 abc 1200 2 4 abc 1300 4 5 abc 1400 2 

затем выполните поворот. 🙂

  • Pandas: Как я могу использовать функцию apply () для одного столбца?
  • Pandas: многоуровневые имена столбцов
  • Пользовательская сортировка в кадре данных pandas
  • Повторная дискретизация Pandas с использованием numpy percentile?
  • Преобразование N по N Dataframe в 3 кадра данных столбца
  • заменить строки в кадре данных pandas
  • Извлечение первого дня месяца столбца типа даты в пандах
  • Python / Pandas - конвертировать из периода панды в строку
  • Python - лучший язык программирования в мире.