将数据保存为向量的 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
我一直在尝试使用 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