@san_m_m

Как создать DataFrame из xml?

Нужно перевести файл xml в DataFrame и что-то не соображу как это сделать.

Есть файл xml со следующей структурой:

<?xml version="1.0" encoding="utf-8"?>
<licenses_list>
	<licenses>
		<name>Министерство здравоохранения Астраханской области</name>
		<activity_type>Медицинская деятельность</activity_type>
		<abbreviated_name_licensee>ООО &quot;КЛИНИКА &quot;ЛИНЛАЙФ&quot;</abbreviated_name_licensee>
		<works>
					<work>100. При оказании первичной, в том числе доврачебной, врачебной и специализированной, медико-санитарной помощи организуются и выполняются следующие работы (услуги):</work>
					<work>100.1. при оказании первичной доврачебной медико-санитарной помощи в амбулаторных условиях по:</work>
					<work>100.1.25. сестринскому делу в косметологии</work>
					<work>100.4. при оказании первичной специализированной медико-санитарной помощи в амбулаторных условиях по:</work>
					<work>100.4.7. анестезиологии и реаниматологии</work>
		</works>
	</licenses>    
</licenses_list>

Я пишу следующее:

import xml.etree.ElementTree as ET
import pandas as pd


tree = ET.parse('Рабочий.xml')
root = tree.getroot()

df_index = ['name', 'activity_type',  'abbreviated_name_licensee', 'works']

df = pd.DataFrame(columns=df_index)  
  
df_index =  ['name', 'activity_type',  'abbreviated_name_licensee', 'works']


 
df = pd.DataFrame(columns=df_index)  
  
for elem in root:  
    for b in range(0,len(elem[3])):
        elements = [elem[0].text, elem[1].text, elem[2].text, elem[3][b].text]
        df = df.append(pd.Series(elements, index=df_index), ignore_index=True)

Что-то никак не могу сообразить как мне всю информацию под тегом works сложить в одну ячейку через запятую...
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
@o5a
Не нужно перебирать элементы 'works' в том же цикле, где и добавляются строки к DF. Если их перебирать, то и складывать в одну строку (через запятые), а потом уже создавать запись в pandas. Или же вообще этот цикл заменить на join():
for elem in root:
    elements = [elem[0].text, elem[1].text, elem[2].text, ','.join(val.text for val in elem[3])]
    df = df.append(pd.Series(elements, index=df_index), ignore_index=True)

Еще стоит учесть, что в таком коде обращение по индексам (elem[0].text и подобное) создает жесткую привязку к позиции узла в xml. Если порядок поменяется, то столбцы будут парситься неверно. Возможно стоило использовать более явное указание: elem.find('name').text
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы