2013-09-02 26 views
6

bir pandalar/df tablosunu almak için basit bir yolu vardır:Pandaları/veri çerçevelerini XML'ye nasıl dönüştürebilirim?

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 

Ve çizgisinde XML dönüştürmek:

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

peşin herhangi bir yardım için.

+1

hmmm to_xml görünüyor garip bir ihmal olduğunu to_html var, to_json vb Belki de bu iyi bir geliştirme isteği olur. –

+0

XML bunu yapmak için yeterince standartlaştırılmış mı? – Jeff

+0

@Jeff Muhtemelen hayır, Viktor'un tarifi muhtemelen bir kullanıcının özel ihtiyaçlarına göre ayarlanmış olabilir. –

cevap

14
Sen DataFrame içinde üst üste gelen item düğümünü oluşturan bir fonksiyon oluşturabilir

:

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) 

Sonra axis=1 boyunca işlevini uygulayın.

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 

Sonra xml yazdırabilirsiniz:

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

Bu çok temiz bir çözümdür./Read_xml dosyasını desteklemek için –

10

(hafifçe yinelenen sütunlar ile çalışmak ve onu verdiği) Viktor mükemmel bir cevap için daha için, bir to_xml DataFrame yöntemi olarak bu kurmak olabilir:

In [22]: df.to_xml('foo.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> 
... 

veya bir dosyaya kaydetmek

Açıkçası bu örnek, xml standardınıza uyacak şekilde ayarlanmalıdır.

+0

değerinde bir sorun açmaya değer – Jeff

2

xml.etree.ElementTree paketini kullanarak çok az kod satırında bir okuma dostu biçim oluşturabilirsiniz.

root = etree.Element('data'); 

for i,row in dframe.iterrows(): 
    item = etree.SubElement(root, 'item', attrib=row.to_dict()); 

etree.dump(root); 

Bu

her satır tipi item olacak olacak (root altında) bir XML Ağacı, oluşturma ve tüm sütunlar için öznitelikleri olacaktır. Her alan için bir alt öğe oluşturarak sütunlarla daha iç içe bir ağaç oluşturabilirsiniz.

Sonra da elementtree paketini kullanarak geri Python xml dosyasını okuyabilir:

xml.etree.ElementTree.parse('xml_file.xml'); 
İlgili konular