【发布时间】:2017-04-29 09:29:17
【问题描述】:
我认为这可能很容易,但我还没有弄清楚。
目标是“扁平化”为 pandas DataFrame。
Here is one xml(直接下载一个 60~ MB 的 zip 文件,解压后会膨胀到 800~ MB 左右)。
我尝试了以下两种方法:
第一个,取自here,稍作修改:
def xml2dfa(xml_data):
tree = ET.parse(xml_data)
root = tree.getroot()[1] # Modification here
all_records = []
headers = []
for i, child in enumerate(root):
record = []
for subchild in child:
record.append(subchild.text)
if subchild.tag not in headers:
headers.append(subchild.tag)
all_records.append(record)
return pd.DataFrame(all_records, columns=headers)
第 3 行 (root) 被修改为获取元素 LEIRecords 而不是 LEIHeader
前面的结果是行数正确但只有 4 列的 DataFrame:
array(['{http://www.leiroc.org/data/schema/leidata/2014}LEI',
'{http://www.leiroc.org/data/schema/leidata/2014}Entity',
'{http://www.leiroc.org/data/schema/leidata/2014}Registration',
'{http://www.leiroc.org/data/schema/leidata/2014}Extension'], dtype=object)
从第 2 列到第 4 列仍有可以提取信息的嵌套子级,但所有信息都丢失了,因为任何列的唯一值都是如下所示的数组:
array(['\n '], dtype=object)
第二种方法我已经运行了至少 16 个小时,没有结果,所以有些地方不对。我是从here 那里得到的。
预期的输出将是一个完全平坦的 DataFrame,并且对于任何不存在的信息(因为特定的树枝没有走那么远,或者没有填充,填充有 NaN (as in this question)
【问题讨论】:
-
查看带有 flatten、fully_flatten 和 auto_separate_tables 方法的 pandas-read-xml 包。