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

Converting a XML-file with data saved as vectors to a pandas dataframe

我一直在尝试使用 Pandas 和 xml.etree.ElementTree.

将嵌套的 XML 文件转换为 Python 中的数据帧

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>

我的主要问题是以分号分隔的这种格式提取数据。我找遍了 Whosebug,没有找到任何类似的帖子。

正在使用

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-tree 的目录,但我仍然得到 None 值。

我最终想要从 XML 文件转换的 pandas 数据帧中的 table 是:

操作数 已用抗生素 住院人数
1 5 4.54 3
2 0 5.71 5
3 12 1
4 8 7.12 2
5 4 8.75 6
6 5 2.99 9
7 7 4.94 8

有人知道如何解决这个问题吗?非常感谢任何帮助!

关键是拆分文本 -> 这会将其转换为列表,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