У меня есть XML-файл, который отформатирован следующим образом:
<?xml version="1.0"?>
-<data>
-<dataset>
<DataID>001</DataID>
<Days>45.7</Days>
<Cost>345</Cost>
<Death>0</Death>
</dataset>
-<dataset>
<DataID>003</DataID>
<Days>2</Days>
<Cost>58.95</Cost>
</dataset>
-<dataset>
<DataID>004</DataID>
<Days>18</Days>
<Cost>4678</Cost>
<Death/>
</dataset>
Дочерними узлами «набора данных» являются «DataID», «Days», «Cost», «Death».Как видите, в некоторых наборах данных дочерние узлы могут быть пустыми или полностью отсутствовать.Я хотел бы получить значения DataID наборов данных, которые не имеют абсолютно отсутствующих или пустых дочерних узлов.Есть ли способ сделать это, используя только панд?Я попытался найти способ чтения / синтаксического анализа XML в фрейме данных Pandas, но не выяснил, как это сделать без библиотеки ElementTree.Пока что это код, который у меня есть:
import xml.etree.ElementTree as ET
import pandas as pd
xml_final_1 ='Documents/xml_final_1.xml'
tree = ET.parse(xml_final_1)
root = tree.getroot()
attrib_list = []
for dataset in tree.findall(".//dataset"):
DataID = dataset.find("./DataID")
Days = dataset.find("./Days")
Cost = dataset.find("./Cost")
Death = dataset.find("./Death")
if DataID is not None and Days is not None and Cost is not None and
Death is not None:
attrib_list.append(DataID.text)
attrib_list.append(Days.text)
attrib_list.append(Cost.text)
attrib_list.append(Death.text)
print(attrib_list)
Итоговый атрибут attrib_list таков:
['001', '45 .7 ',' 345 ',' 0 ','002 ',' 12 ',' 578 ',' 1 ',' 004 ',' 18 ',' 4678 ', None,' 006 ',' 1.8 ',' 326.90 ',' 0 ',' 008 ','65,7 ',' 13674 ',' 0 ']
Итак, я знаю, что есть 5 значений DataID без отсутствующих дочерних узлов.Однако обратите внимание, что я все еще получаю пустое значение «Нет» для DataID 004, поэтому DataID 004 следует исключить из результатов.
Я попытался передать список на фрейм данных из 5 строк и 4столбцы, что я и хочу, но выдает ошибки.Вот код, который я пробовал:
df = pd.DataFrame( attrib_list, index= range(0,5), columns = ['DataID', 'Days', 'Cost', 'Death'])
print(df)
Пожалуйста, помогите!Опять же, я хотел бы сделать это, используя только панд, если есть способ.Если нет, единственной дополнительной библиотекой, которую я хотел бы использовать, является ElementTree.Я думаю, что могу как-то составить информационный фрейм из списка, который я получил, и затем каким-то образом отфильтровать информацию из DataID 004, значение смерти которого равно «Нет»?Результаты должны быть только идентификаторами данных, которые я вижу, 001, 002, 006 и 008.