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