首页 > 解决方案 > 如何将此非统一 XML 文件转换为 Pandas 数据框

问题描述

我有一个这样的 XML 文件

<TestingValue>

<result>

<attr1>Attribute1</attr1>
<attr2>Attribute2</attr2>

<feature>

<a>a2</a>
<b>b2</b>
<c>c2</c>
<d>d3</d>

</feature>
<feature>

<a>a1</a>
<b>b2</b>
<d>d3</d>


</feature>
<feature>
<b>b2</b>
<c>c2</c>
<d>d3</d>

</feature>
<feature>
<a>a1</a>
<b>b2</b>



</feature>

<feature>
<a>a1</a>

<d>d3</d>

</feature>


</result>

</TestingValue>

我需要像这样创建一个熊猫数据框。

     Attr1         Attr2      a    b   c   d
Attribute 1   Attribute2      a2   b2  c2  d2
Attribute 1   Attribute2      a1   b2  00  d3
Attribute 1   Attribute2      00   b2  c2  d3
Attribute 1   Attribute2      a1   b2  00  00
Attribute 1   Attribute2      a1   00  00  d3

为了增加这个问题,我不知道结果标签中有多少特征标签或元素。

我需要找出哪些值不存在并用零填充它们。我还不能这样做。如何找出 pandas 数据框的格式,然后找出哪些元素没有特定的特征标签?

标签: pythonxmlpandas

解决方案


这似乎可以解决问题。

import pandas as pd                                                                                 
import xml.etree.ElementTree as et                                                                  

def xml_to_df(filename):                                                                            
    rows = []                                                                                       
    attributes = {}                                                                                 
    xtree = et.parse("data.xml")                                                                    
    xroot = xtree.getroot()                                                                         
    result = xroot.find("result")                                                                   
    for feature_or_attr in result:                                                                  
        if feature_or_attr.tag == "feature":                                                        
            rows.append({node.tag: node.text for node in feature_or_attr})                          
        else:                                                                                       
            attributes[feature_or_attr.tag] = feature_or_attr.text                                  
    df = pd.DataFrame(rows)                                                                         
    df.fillna('00', inplace=True)                                                                   
    for key, val in attributes.items():                                                             
        df[key] = val                                                                               
    return df                                                                                       

print(xml_to_df("data.xml"))

输出:

    a   b   c   d       attr1       attr2
0  a2  b2  c2  d3  Attribute1  Attribute2
1  a1  b2  00  d3  Attribute1  Attribute2
2  00  b2  c2  d3  Attribute1  Attribute2
3  a1  b2  00  00  Attribute1  Attribute2
4  a1  00  00  d3  Attribute1  Attribute2

为了解决您关于不知道哪些值为 null 的观点——pandas 不在乎。在我构建每个row时,我只定义了尽可能多的功能。当每个row对象变成 中的实际行时DataFrame,pandas 会自动用 NaN 填充缺失值。这些都替换为df.fillna('00', inplace=True).

列的名称是根据 XML 中的值生成的。


推荐阅读