web-dev-qa-db-ja.com

パンダ/データフレームを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>

and so on...

助けてくれてありがとう。

13
user7289

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>
...
23
Viktor Kerkez

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

次に、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標準に合うように調整する必要があります。

19
Andy Hayden

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パッケージを使用してxmlファイルをPythonに戻すこともできます。

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