将 openpyxl 数据传递给 pandas
pass openpyxl data to pandas
我正在从 excel 文件的数据中将“全名”字段拆分为“名字”、中间名和“姓氏”字段。我不知道如何在pandas,所以我转向了 openpyxl。我根据需要拆分了变量。但是,since adding columns to openpyxl for the new fields is not easy,我想我会把值传递给 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()
有什么想法吗?
谢谢
几件事。首先,您的代码只会得到一行,因为每次通过 if 测试时您都会覆盖这些值。例如,
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
但是,我认为如果您知道如何用 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 sheet 的全部或部分转换为 Pandas Dataframe 变得非常容易:ws.values
是所有这些值的迭代器在 sheet。它还具有一个新的 ws.iter_cols()
方法,可让您直接使用列。
它目前(2016 年 4 月)作为 alpha 版本提供,可以使用 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")
我正在从 excel 文件的数据中将“全名”字段拆分为“名字”、中间名和“姓氏”字段。我不知道如何在pandas,所以我转向了 openpyxl。我根据需要拆分了变量。但是,since adding columns to openpyxl for the new fields is not easy,我想我会把值传递给 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()
有什么想法吗?
谢谢
几件事。首先,您的代码只会得到一行,因为每次通过 if 测试时您都会覆盖这些值。例如,
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
但是,我认为如果您知道如何用 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 sheet 的全部或部分转换为 Pandas Dataframe 变得非常容易:ws.values
是所有这些值的迭代器在 sheet。它还具有一个新的 ws.iter_cols()
方法,可让您直接使用列。
它目前(2016 年 4 月)作为 alpha 版本提供,可以使用 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")