将openpyxl数据传递给pandas

我从excel文件的数据中将“全名”字段拆分为“名字”,“中间名”和“姓氏”字段,我不知道如何在pandas中这样做,所以我转向了openpyxl。得到的variables分裂,因为我想要的。但是, 因为添加列到openpyxl的新领域是不容易的 ,我想我会传递给pandas的值。

我运行代码时生成了我需要的数据框,但是一旦将df发送到ExcelWriter,只有最后一行被添加到Excel文件中。 数据是在正确的地方,但。

代码如下:

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

有任何想法吗?

谢谢

几件事情。 首先,你的代码只会给你一行,因为你每次通过iftesting都会覆盖这些值。 例如,

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

这将string分配给variableslastname 。 你不追加到列表,你只是分配一个string。 然后,当你使你的数据df = pd.DataFrame({'personID':id,'lastName':lastname,...df = pd.DataFrame({'personID':id,'lastName':lastname,...你使用这个值,所以数据框将只能保存该string。做这个使用openpyexcel,尝试像这样:

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

不过,我认为如果你只是想出如何用大pandas做到这一点,你的生活将会变得容易得多。 这其实很简单。 尝试这样的事情:

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

FWIW openpyxl 2.4使得将全部或部分Excel工作表转换为Pandas Dataframe变得非常容易: ws.values是工作表中所有值的迭代器。 它还有一个新的ws.iter_cols()方法,可以让你直接使用列。

目前(2016年4月)以alpha版本forms提供,可以使用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")