如何将pandas数据框转换为XML?

30

有没有一种简单的方法可以处理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>

3
嗯,似乎缺少to_xml这个奇怪的选项,有to_html、to_json等。也许这会成为一个很好的增强请求。 - Andy Hayden
1
XML是否标准化到足以实现这一点? - Jeff
1
@Jeff 可能不需要,我认为维克托的配方可能可以根据用户的特定需求进行调整。 - Andy Hayden
4个回答

36

你可以创建一个函数,从你的 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>
...

这是一个非常简洁的解决方案。 - Andy Hayden
3
问题在于,如果InnerText中存在特殊字符,它将无法对其进行转义。 这里有许多XML标准需要遵循。 如果您的数据非常清楚,没有标点符号,那么这种方法可以使用。 否则,如果您的数据包含诸如'shoe lace count> 2'之类的文本,这将使任何XML阅读器出错。 一个好的XML库将把它编码为'shoe lace count > 2'。 - Vinnie Amir
我正在尝试对一个有100万行的pandas数据框执行to_xml()操作,但它无法正常工作... 是否有针对这种情况进行优化的版本? - Francesco Pegoraro
我遇到了AttributeError: 'function' object has no attribute 'apply'的错误。 - earl
如果您有嵌入式对象呢?元素中的元素中的元素? - Timbus Calin
@ArvinAmir:我也遇到了这个问题,找到解决方法可真不容易(回想起来还是很明显的,唉)。在将数据框列传递给 XML 转换器之前,使用 https://wiki.python.org/moin/EscapingXml 对所有特殊元素进行转义。 - Mitalee Rao

25

在 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 标准。


在数据框上有什么类似的解决方案?不使用pandas。 - earl

17
你可以使用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 格式? - peter_parker

9

v1.3 开始,您可以简单地使用:

df.to_xml()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接