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

时间:2019-07-20 01:56:16

标签: python 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

要解决的问题是,我不知道结果标签中有多少个功能标签或元素。

我需要找到不存在的值,并用零填充。我还不能做到这一点。如何找出熊猫数据框的格式,然后找出哪些元素没有特定的功能标签?

1 个答案:

答案 0 :(得分:1)

这似乎可以解决问题。

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中的实际行时,大熊猫会自动用NaN填充缺失值。这些都被df.fillna('00', inplace=True)取代。

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