【问题标题】:pass openpyxl data to pandas将 openpyxl 数据传递给熊猫
【发布时间】:2016-08-07 22:06:25
【问题描述】:

我将“全名”字段从 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()

有什么想法吗?

谢谢

【问题讨论】:

    标签: python excel pandas openpyxl


    【解决方案1】:

    有几件事。首先,您的代码只会得到一行代码,因为您每次通过 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')
    

    【讨论】:

    • 谢谢。不敢相信我忘了附加到列表中。我遇到问题的 pandas 部分是将名称字段分成 3 个,这在 openpyxl 中更容易
    • 我使用的是 pd.read_excel,但它不解释公式,这不是阅读 xlsx 的一个很好的解决方案
    【解决方案2】:

    FWIW openpyxl 2.4 使得将 Excel 工作表的全部或部分转换为 Pandas 数据框变得非常容易:ws.values 是工作表中所有值的迭代器。它还有一个新的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")
    

    【讨论】:

    • 我找到了 ws.values,但它不起作用。我以为我有正确的 openpxl 版本,但根据你的解释,我确定我没有。
    • 您需要使用库的 alpha 版本来获取 ws.values,但正如代码所示,您的任务似乎不需要它。
    • 我更新了 openpyxl 并使用了 ws.values,因为此代码将成为其他基于 pandas 的代码的一部分。
    • 最好仔细检查您使用的是 2.4 alpha。您可能还想使用结帐。请参阅有关如何执行此操作的文档。
    猜你喜欢
    • 2015-01-13
    • 2022-01-23
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多