[英]How do convert a pandas dataframe to XML?
有没有一种简单的方法来获取 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>
等等。
您可以创建一个函数,用于从 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>
...
要扩展 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 标准。
您可以使用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');
从v1.3 开始,您可以简单地使用:
df.to_xml()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.