如何将pandas/dataframe转换为XML?

use*_*289 12 python xml pandas

有一个简单的方法来获取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
Run Code Online (Sandbox Code Playgroud)

并将其转换为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>

and so on...
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

Vik*_*kez 23

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

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)
Run Code Online (Sandbox Code Playgroud)

然后沿着应用函数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>
...
Run Code Online (Sandbox Code Playgroud)

  • 问题在于,如果您在 InnerText 中有特殊字符的字符,它不会转义它们。这里有大量的 XML 标准需要遵循。如果您有非常知名的数据,没有标点符号,那么这将起作用。否则,如果您的数据有一些文本,如“鞋带计数 &gt; 2”,这将抛弃任何 XML 阅读器。一个好的 XML 库会将其编码为“鞋带数&gt;”。2'。 (3认同)

And*_*den 19

要扩展Viktor的优秀答案(并稍微调整一下以使用重复的列),您可以将其设置为to_xmlDataFrame方法:

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
Run Code Online (Sandbox Code Playgroud)

然后你可以打印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>
...
Run Code Online (Sandbox Code Playgroud)

或将其保存到文件:

In [22]: df.to_xml('foo.xml')
Run Code Online (Sandbox Code Playgroud)

显然,应该调整此示例以适合您的xml标准.


uke*_*emi 9

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

df.to_xml()
Run Code Online (Sandbox Code Playgroud)


spa*_*dfs 7

您可以使用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);
Run Code Online (Sandbox Code Playgroud)

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

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

xml.etree.ElementTree.parse('xml_file.xml');
Run Code Online (Sandbox Code Playgroud)