【问题标题】:Flatten xml into pandas dataframe, deeply nested将 xml 扁平化为 pandas 数据框,深度嵌套
【发布时间】: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 包。

标签: python xml pandas


【解决方案1】:

我遇到了类似的问题。我有来自 ebscohost 的关于搜索返回的研究文章的 xml。

使用 xmltodict https://github.com/martinblech/xmltodict

import xmltodict

with open(filename) as fd:
    doc = xmltodict.parse(fd.read())

这将 xml 转换为嵌套字典

使用堆栈溢出链接中的示例代码,

def flatten_dict(dd, separator='_', prefix=''):
    return { prefix + separator + k if prefix else k : v
             for kk, vv in dd.items()
             for k, v in flatten_dict(vv, separator, kk).items()
             } if isinstance(dd, dict) else { prefix : dd }

我在单个文章的级别上扁平化了字典(在我的情况下降低了两个级别 - doc['records']['rec'])

flattened_doc = [flatten_dict(x) for x in doc['records']['rec']]

然后从结果列表中创建一个数据框

data1 = pd.DataFrame(flattened_doc)

有些列仍然包含 dicts,但它处于我不关心的级别。扁平化字典的功能只会在编写时将两层扁平化。

【讨论】:

  • 如果您对某些默认值感到满意,可以使用pandas.io.json.json_normalize 来避免编写自己的flatten_dict 方法。尽管有“json”名称,json_normalize 接受嵌套字典并将生成数据框
  • 谢谢,我去看看。
猜你喜欢
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2021-01-18
  • 2021-06-17
  • 2017-04-17
  • 2018-08-27
  • 2021-05-24
相关资源
最近更新 更多