2013-09-02 24 views
6

to istnieje prosty sposób do podjęcia tabelę pandy/DF:Jak przekonwertować pand/ramkę danych na 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 

i konwertować je do formatu XML wzdłuż linii:

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

Z góry dziękuję za wszelką pomoc.

+1

hmmm wydaje to_xml jest dziwne przeoczenie, istnieje to_html, to_json itd. Być może byłoby to zrobić dobry wniosek akcesorium. –

+0

jest wystarczająco wystandaryzowany XML, aby to zrobić? – Jeff

+0

@Jeff Prawdopodobnie nie, myślę, że przepis Viktora może zostać poprawiony do konkretnych potrzeb użytkownika. –

Odpowiedz

14

Można utworzyć funkcję, która tworzy węzeł z rzędu item w DataFrame:

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) 

a następnie zastosować funkcję wzdłuż 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

To bardzo miłe rozwiązanie. –

10

Aby rozwinąć na doskonałą odpowiedź Wiktora (i szczypanie to nieco pracę z duplikatów kolumn), można to ustawić jako metoda 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 

Następnie można wydrukować 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> 
... 

lub zapisać go do pliku:

In [22]: df.to_xml('foo.xml') 

Oczywiście ten przykład powinien zostać zmodyfikowany zgodnie ze standardem XML.

+0

warto otworzyć problem do obsługi/read_xml – Jeff

2

Możesz użyć pakietu xml.etree.ElementTree, aby wygenerować przyjazny dla odczytu format w bardzo niewielu liniach kodu.

root = etree.Element('data'); 

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

etree.dump(root); 

To stworzy drzewo XML (pod root), gdzie każdy wiersz będzie typu item i mieć atrybuty dla wszystkich kolumn. Można również utworzyć drzewo bardziej zagnieżdżone z kolumnami, tworząc podelement dla każdego pola.

Następnie można również odczytać pliku xml z powrotem w Pythonie przy użyciu pakietu ElementTree:

xml.etree.ElementTree.parse('xml_file.xml'); 
Powiązane problemy