大型XML文件 - 附加到Pandas DF - 越来越慢

时间:2018-01-12 00:40:02

标签: python xml parsing

我正在尝试将XML转换为可用的数据格式,因此我选择了一个pandas数据帧。下面是一些代码,它通过我的XML树并提取每个数据点所需的数据。问题是大约有632,000行。我的代码越来越慢,以至于需要100秒才能完成1000次迭代。我认为通过每个数据点应该是相对线性的,但有些东西正在减慢它。

有什么建议吗?

如果需要,我可以提供完整的代码并链接到数据集。

感谢。

import xml.etree.cElementTree as ET

tree = ET.parse(path+xname)
root = tree.getroot()
data = pd.DataFrame(None,columns=["GEO","AGE","SEX","YEAR","VALUE"])
b = time.time()
c = len(root[1])

for i in range(1,range(len(root[1])):
    if i % 1000 == 0:
        a = time.time()
        print (a - b)
        b = time.time()
    data = data.append({"GEO":root[1][i][0][0].attrib["value"], \
                        "AGE":root[1][i][0][1].attrib["value"], \
                        "SEX":root[1][i][0][2].attrib["value"], \
                        "TIME":root[1][i][1][0].text, \
                        "VALUE":root[1][i][1][1].attrib["value"]}, \
                       ignore_index=True)
    root[1][i].clear()

1 个答案:

答案 0 :(得分:2)

通常,您希望在将整个数据集传递给数据框构造函数之前构建它。追加非常缓慢,因为它在后端从头开始创建一个完整的新数据框。

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

tree = ET.parse(path+xname)
root = tree.getroot()

data = []
for i in range(1, range(len(root[1])):
    data.append((root[1][i][0][0].attrib["value"], 
                 root[1][i][0][1].attrib["value"], 
                 root[1][i][0][2].attrib["value"], 
                 root[1][i][1][0].text, 
                 root[1][i][1][1].attrib["value"]))

df = pd.DataFrame(data ,columns=["GEO","AGE","SEX","YEAR","VALUE"])