将保存为向量的数据的XML文件转换为pandas数据框。

3

我将尝试使用Pandas和xml.etree.ElementTree库将一个嵌套的XML文件转换为Python中的DataFrame。

XML文件如下:

<Hospital>
    <HospitalClass name = "St. Mungo's Hospital for Magical Maladies">
        <dataStorage id ="3" class="UnitVector">
            <UnitVector name="numHospitalized">
                <Data> 3; 5; 1; 2; 6; 9; 8  </Data>
            </UnitVector>
        </dataStorage>
        <dataStorage id ="1" class="UnitVector">
            <UnitVector name="numOperated">
                <Data> 5; 0; 12; 8; 4; 5; 7</Data>
            </UnitVector>
        </dataStorage>
        <dataStorage id = "2" class ="UnitVector">
            <UnitVector name="antibioticsUsed">
                <Data> 4.54; 5.71; nan; 7.12; 8.75; 2.99; 4.94</Data>
            </UnitVector>
        </dataStorage>
    </HospitalClass>
</Hospital>

我的主要问题是提取以分号分隔的格式的数据。我已经在stackoverflow上搜索了很久,但没有找到任何类似的帖子。
使用:
import pandas as pd
import xml.etree.ElementTree as et

tree = et.parse("Hospital.xml")
root = tree.getroot()

for child in root.iter():
    print(child.tag, child.attrib)


您可以访问存储为标签和属性的信息,但我不确定如何访问存储在数据字段中的值。
import pandas as pd
import xml.etree.ElementTree as et

tree = et.parse("Hospital.xml")
root = tree.getroot()

df_cols = ["numOperated", "antibioticsUsed", "numHospilaized"]
rows = []

for node in root:
    numOperated = node.attrib.get("numOperated")
    antibioticsUsed = node.attrib.get("antibioticsUsed")
    numHospilaized = node.attrib.get("numHospilaized")

    rows.append({"numOperated": numOperated, "antibioticsUsed " : antibioticsUsed,
    "numHospilaized ": numHospilaized  })
df = pd.DataFrame(rows,colums = df_cols)
print(df)

我尝试过的解决方案,但这只打印出 None 和 Nan 作为唯一的值。我还尝试在上面的代码中添加 XML 树的目录,但最终仍然得到 None 值。

我最终想要在 pandas dataframe 中将 XML 文件转换成的表格是:

手术次数 使用抗生素 住院次数
1 5 4.54 3
2 0 5.71 5
3 12 nan 1
4 8 7.12 2
5 4 8.75 6
6 5 2.99 9
7 7 4.94 8

有人知道如何解决这个问题吗?我真的很感激任何帮助!

1个回答

6
关键是将文本进行分割,这将其转换为一个列表,Pandas可以内部将其转换为Series/Column。
data = """<Hospital>
     ...:     <HospitalClass name = "St. Mungo's Hospital for Magical Maladies">
     ...:         <dataStorage id ="3" class="UnitVector">
     ...:             <UnitVector name="numHospitalized">
     ...:                 <Data> 3; 5; 1; 2; 6; 9; 8  </Data>
     ...:             </UnitVector>
     ...:         </dataStorage>
     ...:         <dataStorage id ="1" class="UnitVector">
     ...:             <UnitVector name="numOperated">
     ...:                 <Data> 5; 0; 12; 8; 4; 5; 7</Data>
     ...:             </UnitVector>
     ...:         </dataStorage>
     ...:         <dataStorage id = "2" class ="UnitVector">
     ...:             <UnitVector name="antibioticsUsed">
     ...:                 <Data> 4.54; 5.71; nan; 7.12; 8.75; 2.99; 4.94</Data>
     ...:             </UnitVector>
     ...:         </dataStorage>
     ...:     </HospitalClass>
     ...: </Hospital>"""

import xml.etree.ElementTree as ET
root = ET.fromstring(data)

将数据收集到字典中:

collection = {}
for entry in root.findall(".//UnitVector"):
    key = entry.attrib['name']
    values = entry.find(".Data").text.split(";")
    collection[key] = values

创建数据框:

pd.DataFrame(collection)
 
  numHospitalized numOperated antibioticsUsed
0               3           5            4.54
1               5           0            5.71
2               1          12             nan
3               2           8            7.12
4               6           4            8.75
5               9           5            2.99
6               8           7            4.94

您的数据将是字符串->您可以使用astype将其转换为int / float


谢谢!我想知道您如何将这些值转换为浮点数?我试图使用: list(map(float, values)) 但是有一些值是''和nan,所以它会崩溃。 - David Kvale
当数据在pandas中时,您可以执行dp.astype(float)来确保列中的文本前后没有空格。 - sammywemmy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接