2016-11-08 2 views
0

Ich arbeite gerade an einer Datenbank und möchte von XML zu einem Pandas DataFrame wechseln und bin schon lange nicht mehr da. Ich habe keine Ahnung, wie ich dieses Problem lösen kann.Python und Pandas: XML -> DataFrame

j=0 
for rows in root.findall('row'): 
    i=0 
    for cells in root.findall('cell') in rows: 
     if i==0: 
      #Name of the country is on the 0-th tag "cell" of each "row" 
      country[j]=cells.text 
     elif i==17: 
      #Number of students is on the 17-th tag "cell" of each "row" 
      numberStudent[j]=cells.text 
     i=i+1 
    j=j+1 
Data=pd.DataFrame({'country': [country], 'number of student': [numberStudent]}) 

Wenn ich versuche, Daten zu lesen, gibt es nur einen Datenrahmen mit einem Wert 0 für Land und 0 für numberStudent. Ich verstehe nicht, was falsch ist. Ich habe bereits auf diesem Forum nach Antwort gesucht, aber ich bin immer noch fest.

Auch ich bin mir nicht sicher, ob ich richtig mache. Ich möchte die 0-te ans 17-te Tag "Zelle" in jeder Eltern-Tag "Zeile" finden. Ist es richtig, zwei Mal "in" in einer Deklaration für die zweite zu verwenden?

Danke für Ihre Hilfe,

Cyril

Antwort

1

Um alle Zellen innerhalb einer Zeile finden Sie in der Zeile in der inneren Schleife rufen findall sollte, nicht an der Wurzel.

country = [] 
numberStudent = [] 
for row in root.findall('row'): 
    i=0 
    for cell in row.findall('cell'): 
     if i==0: 
      country.append(cell.text) 
     if i==17: 
      numberStudent.append(cell.text) 
     i=i+1 
data=pd.DataFrame({'country': country, 'number of student': numberStudent}) 

Allerdings sollte Ihr Code, wie geschrieben, einen Fehler erzeugen, also vermute ich, dass Sie auch keine Zeilenknoten finden. Wenn Ihre Zeilenknoten kein untergeordnetes Element des Stammverzeichnisses sind, müssen Sie root.findall('.//row') aufrufen, obwohl es ohne Ihr XML nicht möglich ist zu wissen, ob das Ihr Problem ist.

Eine andere Alternative ist, dass ElementTree Unterstützung nummerierte Elemente für die Suche hat, so könnten Sie auch tun

country = [cell.text for cell in root.findall('.//row/cell[1]')] 
numberStudent = [cell.text for cell in root.findall('.//row/cell[18]')] 
data=pd.DataFrame({'country': country, 'number of student': numberStudent}) 

root.findall('.//row/cell[n]') wird jede Zelle Element finden, das die n-te Kind eines Zeilenelement ist. Aber Vorsicht, ElementTree verwendet eine einstufige Indexierung anstelle der standardmäßigen Nullindexierung auf Python-Basis.