将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")