2016-04-15 7 views
0

「フルネーム」フィールドをExcelファイルのデータから「ファーストネーム」、「ミドルネーム」、「ラストネーム」フィールドに分割しています。でも、私はopenpyxlに目を向けましたが、私が望むように変数を分割しましたが、since adding columns to openpyxl for the new fields is not easy、私はパンダに値を渡すと思っていました。私はExcelWriterにDFを送った後、唯一の最後の行は、Excelファイルに追加されたデータはしかし、適切な場所である。ここ パンダにopenpyxlデータを渡す

コードです:。。

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

アイデア

ありがとうございました

答えて

1

いくつかのことがあります。まず、ifのテストをパスするたびに値を上書きするため、コードでは1行しか取得できません。

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

これは、変数lastnameに文字列を割り当てます。あなたはリストに追加されていません。文字列を割り当てるだけです。その後、データフレームを作成すると、 df = pd.DataFrame({'personID':id,'lastName':lastname,...がこの値を使用するため、データフレームにはその文字列しか保持されません。理にかなっている?あなたがopenpyexcelを使用して、これを行う必要がある場合は、何かしてみてください:しかし

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

を、私はあなただけパンダでこれを行う方法を見つけ出す場合、あなたの人生は、最終的にははるかに容易になると思います。実際には非常に簡単です。このような何かを試してみてください:2.4は、それは非常に簡単パンダDATAFRAMEにExcelシートの全部または一部を変換することができ

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

感謝。私はリストに追加するのを忘れていたとは思わない。私が問題を抱えていたパンダの部分は、名前フィールドを3に分割していましたが、これはopenpyxlで簡単でした – mattrweaver

1

FWIW openpyxl:ws.valuesは、シート内の値のすべてのイテレータです。また、新しいws.iter_cols()メソッドがあり、列を使って直接作業することができます。

現在はアルファ版として(2016年4月)が利用可能だとコードは、ビットのようになりますpip install -U --pre openpyxl

を使用してインストールすることができます。

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

ws.valuesが見つかりましたが、動作しませんでした。私は正しいバージョンのopenpxlを持っていると思っていましたが、あなたの説明に基づいて、私は確信していませんでした。 – mattrweaver

+0

'ws.values'を得るにはアルファベットのライブラリを使う必要がありますが、コードが示すように、あなたの仕事には必要ないようです。 –

+0

このコードは他のパンダベースのコードの一部であるため、openpyxlを更新してws.valuesを使用しました。 – mattrweaver

関連する問題