gpt4 book ai didi

python - 如何将 XML 文件转换为 Pandas 数据框

转载 作者:行者123 更新时间:2023-12-01 06:31:19 26 4
gpt4 key购买 nike

我想转换以下 XML 文件:

<data>
<level_1 name="employment">
<level_2 name="sub-employment">
<indicator>ind1</indicator>
<indicator>ind2</indicator>
</level_2>
<level_2 name="sub-employment2">
<indicator>ind3</indicator>
</level_2>
</level_1>
<level_1 name="health">
<level_2 name="sub-health">
<level_3 name="sub-sub-health">
<indicator>ind4</indicator>
</level_3>
</level_2>
</level_1>
</data>

进入 Pandas 数据框,结果类似于:

  level_1   level_2         level_3        indicator

0 employment sub-employment None ind1
1 employment sub-employment None ind2
2 employment sub-employment2 None ind3
3 health sub-health sub-sub-health ind4

在 import xml.etree.cElementTree as et 和 import pandas as pd 后,我使用了以下代码:

def getvalueofnode(node):
""" return node text or None """
return node.text if node is not None else None
def main():
""" main """
parsed_xml = et.parse("tree.xml")
dfcols = ['level_1', 'level_2', 'level_3', 'indicator']
df_xml = pd.DataFrame(columns=dfcols)

for node in parsed_xml.getroot():
name = node.attrib.get('name')
level_2 = node.find('level_2')
level_3 = node.find('level_3')
indicator = node.find('indicator')

df_xml = df_xml.append(
pd.Series([name, getvalueofnode(level_2), getvalueofnode(level_3),
getvalueofnode(indicator)], index=dfcols),
ignore_index=True)
print(df_xml)
main()

但我得到了错误的结果:

      level_1   level_2 level_3 indicator
0 employment \n None None
1 health \n None None

我在这里做错了什么?

最佳答案

定义以下函数,创建祖先字典,从节点开始向上:

def parNames(node, root):
names = {}
while True:
node = parentMap[node]
if node is root:
return names
names[node.tag] = node.attrib['name']

稍后会需要它。它使用 parentMap 字典,这将是即将创建。

读取您的输入文件:

tree = et.parse('tree.xml')
root = tree.getroot()

实际处理应该从创建父 map 开始- 一个字典,每个节点返回其父节点:

parentMap = {}
for parent in root.iter():
for child in parent:
parentMap[child] = parent

要为 DataFrame 创建源数据,请运行:

rows = []
for it in root.iter('indicator'):
row = parNames(it, root)
row[it.tag] = it.text
rows.append(row)

此循环创建一个字典列表(每行的数据)。每行(字典)包含:

  • 迭代器键下 - 相应节点的文本,
  • 在“父”键 (level_...) 的 name 属性下 parent (由 parNames 函数返回)。

下一步是创建 DataFrame:

df2 = pd.DataFrame(rows).fillna('').sort_index(axis=1)

唯一要做的步骤是将指示器列移动到最后一个位置:

df2 = df2.reindex(df2.columns.drop('indicator')
.append(pd.Index(['indicator'])),axis=1)

关于python - 如何将 XML 文件转换为 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59902016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com