高效地将不一致XML解析为pandas数据帧

2024-09-29 18:56:28 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是关于使用以下结构解析不一致的XML

<items>
<item>
    <propertyA>1</propertyA>
    <propertyB>B</propertyB>
    <propertyC>2017</propertyC>
</item>
<item>
    <propertyB>BB</propertyB>
    <propertyD>D-2017</propertyD>
</item>
<item>
    <propertyE>E</propertyE>
    <propertyF>11:25</propertyF>
</item>
</items>

我希望每个项目都是数据帧中的记录。最终的数据帧应该具有所有的属性A、B、C、D、E、F,并且记录应该有NaN或其他属性,以防它们没有这些值。在

我现在的做法是

^{pr2}$

正如你所看到的,我是通过添加新的pd系列到数据帧。这种方法似乎是防弹的(至少对我来说是D),而且我的数据是一致的。在

问题是,这是非常低效的10万个项目,它需要很长的时间。 你推荐什么?在

谢谢你花时间来回答我的问题。我很感激你的新手。在


Tags: 数据项目属性记录时间itemsxmlitem
1条回答
网友
1楼 · 发布于 2024-09-29 18:56:28

考虑用pd.concat(一种快速的行/列绑定方法)附加数据帧而不是序列,如果数据帧列表中的列不对齐,则填充nan。另外,下面运行了一个不同的解析,其中包含迭代地强制转换到dataframe的字典列表:

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

xml_str = '''
<items>
<item>
    <propertyA>1</propertyA>
    <propertyB>B</propertyB>
    <propertyC>2017</propertyC>
</item>
<item>
    <propertyB>BB</propertyB>
    <propertyD>D-2017</propertyD>
</item>
<item>
    <propertyE>E</propertyE>
    <propertyF>11:25</propertyF>
</item>
</items>'''

dfs = []

def load_inconsistent_xml(xml):        
    data = []; inner = {}

    root = ET.fromstring(xml)        
    for child in root.iterfind('item'):
        for grandchild in child.iterfind('./*'):            
            inner[grandchild.tag] = grandchild.text

        data.append(inner)
        dfs.append(pd.DataFrame(data))
        data = []; inner = {}

    finaldf = pd.concat(dfs).reset_index(drop=True)
    print(finaldf)

#   propertyA propertyB propertyC propertyD propertyE propertyF
# 0         1         B      2017       NaN       NaN       NaN
# 1       NaN        BB       NaN    D-2017       NaN       NaN
# 2       NaN       NaN       NaN       NaN         E     11:25

相关问题 更多 >

    热门问题