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

巴克

我想转换以下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>

放入熊猫数据框,结果类似于:

  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

在将xml.etree.cElementTree导入为et并将熊猫导入为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

我在这里做错了什么?

Valdi_Bo

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

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()

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

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 _...)的名称属性下(由parNames函数返回)。

下一步是创建DataFrame:

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将 XML 数据转换为 Pandas 数据框?

如何将 xml 文件转换为 R 数据框

如何将此非统一XML文件转换为Pandas数据框

如何将XML文件转换为漂亮的熊猫数据框?

如何将多个行标记xml文件转换为数据框

将 xml 文件的条目转换为 Pandas 数据框

如何将numpy数组转换为pandas数据框?

如何将嵌套字典转换为pandas数据框?

如何将嵌套字典转换为pandas数据框?

如何将 Pandas 数据框转换为 json

如何将 Pandas 数据框的行转换为列

将 xml 转换为 Pandas 数据框

将XML转换为pandas数据框

如何将json文件转换为pandas数据帧

如何将pandas数据框转换为具有rdd属性的pyspark数据框?

如何将数据框字典转换为数据框?

如何将xarray数据集转换为dask数据框内的pandas数据框

如何将字节数据转换为python pandas数据框?

如何将JSON时间序列数据转换为pandas数据框?

如何将生成的数据转换为熊猫数据框

如何将类对象数组转换为 Pandas 中带有列的数据框?

如何将python列表转换为具有预定义列的pandas数据框

如何将包含元组列表的字典中的字典转换为pandas数据框

如何将具有相似名称的列的 Pandas 数据框转换为行?

如何将平面项/列表转换为Pandas数据框

如何将模型对象列表转换为pandas数据框?

如何将unicode中的元组的元组转换为python中的pandas数据框

如何将嵌套字典列表转换为pandas数据框?

如何将这种嵌套的JSON以列形式转换为Pandas数据框