我正在尝试将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()
答案 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"])