【问题标题】:Converting pandas dataframe to XML将熊猫数据框转换为 XML
【发布时间】:2017-11-07 12:04:08
【问题描述】:

我知道以前有人问过这个问题,而我的最后一个问题被搁置了,所以现在我要详细说明它。 我有一个人口信息的 CSV 文件,我将它读给 pandas,现在必须将其转换为 XML,例如像这样
<?xml version="1.0" encoding="utf-8"?> <populationdata> <municipality> <name> Akaa </name> <year> 2014 </year> <total> 17052 ......

这是我的代码的阅读部分:
import pandas as pd pop = pd.read_csv(r'''directory\population.csv''', delimiter=";")

尝试像前面提到的那样使用函数和循环链接:How do convert a pandas/dataframe to XML?。还没成功,请问有其他推荐吗?

这是我的数据框示例:
Alahärmä 2014 0 0.1 0.2 0 Alajärvi 2014 10171 5102 5069 1 Alastaro 2014 0 0 0 2 Alavieska 2014 2687 1400 1287 3 Alavus 2014 12103 6102 6001 4 Anjalankoski 2014 0 0 0

对 python 相当陌生,所以任何帮助都非常感谢。

【问题讨论】:

  • 你能给我们看看你的数据框的 head()
  • 这是它显示的内容:Alahärmä 2014 0 0.1 0.2 0 Alajärvi 2014 10171 5102 5069 1 Alastaro 2014 0 0 0 2 Alavieska 2014 2687 1400 1287 3 Alavus 2014 12103 6102 6001 4 Anjalankoski 2014 0 0 0
  • 这能回答你的问题吗? How do convert a pandas/dataframe to XML?

标签: python xml pandas


【解决方案1】:

您链接到的问题实际上对您的问题有很好的答案,但我想您在将数据转换到该解决方案时遇到困难,所以我在下面为您完成了。

好的,您的详细程度有点粗略。如果您的具体情况略有不同,那么您需要调整我的答案,但这里有一些对我有用的东西:

首先假设你有一个如下的文本文件:

0       Alahärmä  2014      0   0.1   0.2
1      Alajärvi  2014  10171  5102  5069
2      Alastaro  2014      0     0     0
3     Alavieska  2014   2687  1400  1287
4        Alavus  2014  12103  6102  6001
5  Anjalankoski  2014      0     0     0

继续创建 python 脚本,我们首先使用以下行导入该文本文件:

pop = pd.read_csv(r'directory\population.csv', delimiter=r"\s+", names=['cityname', 'year', 'total', 'male', 'females'])

这会将文本文件作为数据框引入,并为新数据框提供正确的列标题。

然后从您链接的问题中获取数据,我们将以下内容添加到我们的 python 脚本中:

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)

print('\n'.join(pop.apply(func, axis=1)))

现在我们把它们放在一起,得到以下结果:

import pandas as pd
pop = pd.read_csv(r'directory\population.csv', delimiter=r"\s+", names=['cityname', 'year', 'total', 'male', ‘females'])

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)

print('\n'.join(pop.apply(func, axis=1)))

当我们运行上述文件时,我们会得到以下输出:

<item>
  <field name="cityname">Alahärmä</field>
  <field name="year">2014</field>
  <field name="total">0</field>
  <field name="male">0.1</field>
  <field name="females">0.2</field>
</item>
<item>
  <field name="cityname">Alajärvi</field>
  <field name="year">2014</field>
  <field name="total">10171</field>
  <field name="male">5102.0</field>
  <field name="females">5069.0</field>
</item>
<item>
  <field name="cityname">Alastaro</field>
  <field name="year">2014</field>
  <field name="total">0</field>
  <field name="male">0.0</field>
  <field name="females">0.0</field>
</item>
<item>
  <field name="cityname">Alavieska</field>
  <field name="year">2014</field>
  <field name="total">2687</field>
  <field name="male">1400.0</field>
  <field name="females">1287.0</field>
</item>
<item>
  <field name="cityname">Alavus</field>
  <field name="year">2014</field>
  <field name="total">12103</field>
  <field name="male">6102.0</field>
  <field name="females">6001.0</field>
</item>
<item>
  <field name="cityname">Anjalankoski</field>
  <field name="year">2014</field>
  <field name="total">0</field>
  <field name="male">0.0</field>
  <field name="females">0.0</field>
</item>

【讨论】:

  • 你是金子!由于括号或 ' 在错误的位置,我得到的错误很少。谢谢!
  • 最后一个问题:如何才能将这个输出保存到 xml 文件中?
  • 如果它仍然对您或某人有帮助: import lxml.etree as ET parser = ET.XMLParser(recover=True) tree = ET.ElementTree(ET.fromstring(xml, parser=parser)) tree .write(文件位置)
猜你喜欢
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2019-10-12
  • 2018-07-14
  • 2021-11-17
相关资源
最近更新 更多