【问题标题】:How do convert a pandas dataframe to XML?如何将熊猫数据框转换为 XML?
【发布时间】:2013-09-05 14:45:59
【问题描述】:

有没有一种简单的方法来获取 pandas/df 表:

field_1 field_2 field_3 field_4
cat     15,263  2.52    00:03:00
dog     1,652   3.71    00:03:47
test     312    3.27    00:03:41
book     300    3.46    00:02:40

并按照以下方式将其转换为 XML:

<item>
  <field name="field_1">cat</field>
  <field name="field_2">15263</field>
  <field name="filed_3">2.52</field>

...

<item>
      <field name="field_1">dog</field>

等等

【问题讨论】:

  • hmmm to_xml 好像是一个奇怪的省略,有to_html、to_json 等。也许这会是一个很好的增强请求。
  • XML 的标准化程度足以做到这一点吗?
  • @Jeff 可能不会,我认为 Viktor 的食谱可能可以根据用户的特定需求进行调整。

标签: python xml pandas dataframe


【解决方案1】:

您可以创建一个函数,从 DataFrame 中的一行创建 item 节点:

def func(row):
    xml = ['<item>']
    for field in row.index:
        xml.append('  <field name="{0}">{1}</field>'.format(field, row[field]))
    xml.append('</item>')
    return '\n'.join(xml)

然后沿axis=1应用函数。

>>> print '\n'.join(df.apply(func, axis=1))
<item>
  <field name="field_1">cat</field>
  <field name="field_2">15,263</field>
  <field name="field_3">2.52</field>
  <field name="field_4">00:03:00</field>
</item>
<item>
  <field name="field_1">dog</field>
  <field name="field_2">1,652</field>
  <field name="field_3">3.71</field>
  <field name="field_4">00:03:47</field>
</item>
...

【讨论】:

  • 这是一个非常简洁的解决方案。
  • 问题在于,如果 InnerText 中有特殊字符,它不会转义它们。这里有许多 XML 标准要遵循。如果您有非常知名的数据,没有标点符号,那么这将起作用。否则,如果您的数据有一些文本,如“鞋带计数 > 2”,这将甩掉任何 XML 阅读器。一个好的 XML 库会将其编码为 'shoe lace count > 2'。
  • 我正在尝试在具有 100 万行的 pandas 数据帧上使用 to_xml(),但它不起作用...是否有针对这种情况的优化版本?
  • 我收到 AttributeError: 'function' object has no attribute 'apply'。
  • 如果你有嵌入的对象呢?元素中的元素?
【解决方案2】:

要扩展 Viktor 的出色答案(并对其稍作调整以处理重复的列),您可以将其设置为 to_xml DataFrame 方法:

def to_xml(df, filename=None, mode='w'):
    def row_to_xml(row):
        xml = ['<item>']
        for i, col_name in enumerate(row.index):
            xml.append('  <field name="{0}">{1}</field>'.format(col_name, row.iloc[i]))
        xml.append('</item>')
        return '\n'.join(xml)
    res = '\n'.join(df.apply(row_to_xml, axis=1))

    if filename is None:
        return res
    with open(filename, mode) as f:
        f.write(res)

pd.DataFrame.to_xml = to_xml

然后就可以打印xml了:

In [21]: print df.to_xml()
<item>
  <field name="field_1">cat</field>
  <field name="field_2">15,263</field>
  <field name="field_3">2.52</field>
  <field name="field_4">00:03:00</field>
</item>
<item>
...

或将其保存到文件中:

In [22]: df.to_xml('foo.xml')

显然这个例子应该被调整以适应你的 xml 标准。

【讨论】:

  • 在数据帧上会有什么类似的解决方案?不使用熊猫。
【解决方案3】:

您可以使用xml.etree.ElementTree 包以几行代码生成易于阅读的格式。

root = etree.Element('data');

for i,row in dframe.iterrows():
    item = etree.SubElement(root, 'item', attrib=row.to_dict());

etree.dump(root);

这将创建一个 XML 树(在根目录下),其中每一行的类型为 item,并具有所有列的属性。您还可以通过为每个字段创建一个子元素来创建一个包含列的更嵌套的树。

然后您还可以使用 ElementTree 包在 Python 中读取 xml 文件:

xml.etree.ElementTree.parse('xml_file.xml');

【讨论】:

  • 不错! etree.dump(root) 打印一个字符串。如何使用此解决方案获得漂亮的 xml 格式?
【解决方案4】:

截至v1.3,您可以简单地使用:

df.to_xml()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2015-06-11
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多