2017-08-13 4 views
0

Ich habe eine for-Schleife, die ich schrieb, die mehrere Tupel wie dieses aus einer XML-Datei zurückgibt. Es sieht etwa so aus:Wie man mehrere Tupel in einen Datenrahmen in Pandas umwandelt

(a, b, c) 
(a, b, c) 
(a, b, c) 
(a, b, c) 
........ 

Die XML-Datei ist so, dass a, b & c unter demselben Kind-Tag sind. Und alle von as, bs und cs haben denselben Datentyp. Ich habe versucht, jede auf eine leere Liste z hinzugefügt bekommen = [], mit dem z.append (yyy) in der gleichen verschachtelten for-Schleife, hielt ich so etwas wie dies bekommen:

[(a, b, c), (a, b, c)] 
[(a, b, c)] 
[(a, b, c), (a, b, c) ... ] 
........ 

Ich verstehe, warum es so ist weil wahrscheinlich jede Liste an dieselbe Kindmarke in der XML-Baumstruktur gebunden ist. Doch was ich wollte, war nur eine Liste von Tupeln wie diese haben:

[(a, b, c), (a, b, c), (a, b, c), (a, b, c), ....] 

ermöglichen mir, dass zu einem Pandas Datenrahmen umwandeln. Was ist der beste Weg, das zu tun? Gibt es eine Möglichkeit, dies direkt aus den Tupeln zu tun, ohne eine Liste zu erstellen? Vielen Dank. Snippet meines Code ist also:

for x in root.findall('xyz'): 
    y = x.abc[-1] 
    z = [] 
    for s in x.iter('xxx'): 
     yyy = s.text, s.attrib['zzz'], y 
     z.append(yyy) 
    print(z) 

Hinweis: abc ist ein untergeordnetes Element von xyz und xxx ist ein weiteres untergeordnetes Element von xyz. zzz ist ein Attribut im xxx-Element-Tag. Beachten Sie auch, dass xxx in diesem Dokument variiert: das bedeutet, dass Sie mehr als eins unter dem xyz-Element haben können.

Die XML sieht ungefähr so ​​aus:

<root> 
    <xyz> 
     <abc>...</abc> 
     <abc>...</abc> 
     <abc>c</abc> 
     <xxx zzz='b'>a</xxx> 
    </xyz> 
    <xyz> 
     <abc>...</abc> 
     <abc>...</abc> 
     <abc>c</abc> 
     <xxx zzz='b'>a</xxx> 
     <xxx zzz='b'>a</xxx> 
    </xyz> 
    ...... 
</root> 

Antwort

0

Doch was ich wollte, war nur eine Liste von Tupeln wie diese haben:

[(a, b, c), (a, b, c), (a, b, c), (a, b, c), ....]

Um alle Tupel in einer Liste zu erhalten, müssen Sie das leere initialisieren Liste z außerhalb aller Schleifen:

z = [] 
for x in root.findall('xyz'): 
    y = x.findall('abc')[-1] 
    for s in x.iter('xxx'): 
     yyy = s.text, s.attrib['zzz'], y.text 
     z.append(yyy) 

print(z) 

Von dort sollten Sie in der Lage sein, Ihre Daten in einen pandas Datenrahmen leicht umzuwandeln. Viel Glück!

+0

Hmmm, es ist mir nicht in den Sinn gekommen, dass ich das nicht hatte, weil normalerweise for-Schleifen wie in C++ und Java initialisiert werden. Hoffe, ich kann ziemlich schnell mit Python auf den neuesten Stand bringen. Danke @MathiasL, dass er mich in die richtige Richtung weist. –

Verwandte Themen