2013-09-02 7 views
6

はパンダ/ DFテーブルを取るための簡単な方法があります:パンダ/データフレームをXMLに変換するにはどうすればいいですか?

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... 

感謝。

+1

なるほどおそらくこれは良い機能拡張要求になるだろうto_xmlは奇妙省略され、to_htmlがあり、to_jsonをなどのようです。 –

+0

はこれを行うのに十分な標準化されたXMLですか? – Jeff

+0

@ジェフおそらく、私はビクターのレシピは、おそらくユーザーの特定のニーズに微調整できると思います。 –

答えて

14

あなたはデータフレームの行から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> 
... 
+0

これは非常にきちんとした解決策です。 –

10

ヴィクトルの優秀な答えに展開するには(重複列を操作するために、わずかにそれを微調整)、あなたは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標準に合わせて調整する必要があります。

+0

/read_xmlをサポートするための問題を開く価値があります – Jeff

2

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); 

これは、各行がタイプitemのもの、およびすべての列の属性を有することになるであろうXMLツリー(ルートの下)、作成されます。各フィールドのサブエレメントを作成することで、列を含むよりネストされたツリーを作成することもできます。

その後、あなたはまた、ElementTreeのパッケージを使用してバックPythonでxmlファイルを読むことができます:

xml.etree.ElementTree.parse('xml_file.xml'); 
関連する問題