2016-04-15 11 views
0

Ich spalte "Full Name" Felder in "Vorname", zweiter Vorname "und" Nachname "Felder aus Daten aus einer Excel-Datei. Ich konnte nicht herausfinden, wie man das in Pandas Ich habe die Variablen aufgeteilt, wie ich es wollte.Aber since adding columns to openpyxl for the new fields is not easy dachte ich, ich würde die Werte an Pandas weitergeben sobald ich die df ExcelWriter, nur die letzte Zeile senden wird in der Excel-Datei hinzugefügt, um die Daten an den richtigen Stellen, obwohlPass Openpyx Daten zu Pandas

Hier ist der Code ist:..

for cellObj in range(2, sheet.max_row+1): 
    #print cellObj 
    id = sheet['A' + str(cellObj)].value 
    fullname = sheet['B' + str(cellObj)].value.strip() 
    namelist = fullname.split(' ') 
    for i in namelist: 
     firstname = namelist[0] 
     if len(namelist) == 2: 
      lastname = namelist[1] 
      middlename = '' 
     elif len(namelist) == 3: 
      middlename = namelist[1] 
      lastname = namelist[2] 
     elif len(namelist) == 4: 
      middlename = namelist[1] 
      lastname = namelist[2] + " " + namelist[3] 
     if (namelist[1] == 'Del') | (namelist[1] == 'El') | (namelist[1] == 'Van'): 
      middlename = '' 
      lastname = namelist[1] + " " + namelist[2] 
    df = pd.DataFrame({'personID':id,'lastName':lastname,'firstName':firstname,'middleName':middlename}, index=[id]) 

    writer = pd.ExcelWriter('output.xlsx') 
    df.to_excel(writer,'Sheet1', columns=['ID','lastName','firstName','middleName']) 
    writer.save() 

Irgendwelche Ideen?

Dank

Antwort

1

Ein paar Dinge. Erstens wird Ihr Code immer nur eine Zeile erhalten, weil Sie die Werte jedes Mal überschreiben, wenn ein if-Test bestanden wird. Beispiel:

if len(namelist) == 2: 
     lastname = namelist[1] 

Hiermit wird der Variablen lastname eine Zeichenfolge zugewiesen. Sie hängen nicht an eine Liste an, Sie weisen nur eine Zeichenfolge zu. Wenn Sie dann Ihren Datenrahmen erstellen, df = pd.DataFrame({'personID':id,'lastName':lastname,... verwenden Sie diesen Wert, so dass der Datenrahmen immer nur diese Zeichenfolge enthält. Sinn ergeben? Wenn Sie dies mit openpyexcel tun müssen, versuchen Sie so etwas wie:

lastname = [] #create an empty list 
if len(namelist) == 2: 
    lastname.append(namelist[1]) #add the name to the list 

Aber ich denke, Ihr Leben wird letztlich viel einfacher, wenn Sie nur herausfinden, wie dies mit Pandas zu tun. Es ist tatsächlich ziemlich einfach. so etwas wie dies versucht:

import pandas as pd 
#read excel 
df = pd.read_excel('myInputFilename.xlsx', encoding = 'utf8') 
#write to excel 
df.to_excel('MyOutputFile.xlsx') 
+0

Dank. Kann nicht glauben, dass ich vergessen habe, an eine Liste anzuhängen. Der Teil in Pandas, mit dem ich Probleme hatte, war die Aufteilung der Namensfelder in 3, was in openpyx einfacher war. – mattrweaver

1

FWIW openpyxl 2.4 macht es ziemlich einfach, alle oder einen Teil eines Excel-Blatt zu einem Pandas Datenrahmen zu konvertieren: ws.values ist ein Iterator für alle, die in der Blattwert. Es hat auch eine neue ws.iter_cols() Methode, mit der Sie direkt mit Spalten arbeiten können.

Es ist derzeit (April 2016) erhältlich als Alpha-Version und kann pip install -U --pre openpyxl

Der Code installiert dann ein bisschen wie folgt aussehen:

sheet["B1"] = "firstName" 
sheet["C1"] = "middleName" 
sheet["D1"] = "lastName" 

for row in sheet.iter_rows(min_row=2, max_col=2): 
    id_cell, name = row 

    fullname = name.value.strip() 
    namelist = fullname.split() 
    firstname = namelist[0] 
    lastname = namelist[-1] 
    middlename = "" 
    if len(namelist) >= 3: 
     middlename = namelist[1] 
    if len(namelist) == 4: 
     lastname = " ".join(namelist[-2:]) 
    if middlename in ('Del', 'El', 'Van', 'Da'): 
     lastname = " ".join([middlename, lastname]) 
     middlename = None 

    name.value = firstname 
    name.offset(column=1).value = middlename 
    name.offset(column=2).value = lastname 

wb.save("output.xlsx") 
+0

Ich hatte ws.values ​​gefunden, aber es funktionierte nicht. Ich dachte, ich hätte die richtige Version von openpxl, aber basierend auf deiner Erklärung bin ich sicher, dass ich es nicht getan habe. – mattrweaver

+0

Sie müssen eine Alpha-Version der Bibliothek verwenden, um 'ws.values' zu erhalten, aber wie der Code zeigt, scheint dies für Ihre Aufgabe nicht notwendig. –

+0

Ich habe openpyxl aktualisiert und ws.values ​​verwendet, weil dieser Code Teil eines anderen pandas-basierten Codes ist. – mattrweaver