首页 > 解决方案 > 使用 Python 从 excel-2 中的值更新 excel-1 中的缺失值

问题描述

我有 2 个 Excel 表,其中包含序列号列表以及购买日期。表 1 是主表,表 2 可以称为该主表的子集。

并非 Sheet-1 中的所有序列号都更新为购买日期。在 Sheet-2 中有那些序列号在 Sheet-1 中缺少其购买日期值。Sheet-2 完全更新了其序列号购买日期值。

我正在尝试从 Sheet-1 中读取所有序列号,在 Sheet-2 中搜索这些序列号,找到相应的购买日期并在 Sheet-1 中更新此值(如果缺少)。

以下是两张表格的布局:(请注意,两张表格中的列名略有不同)

表 1

Serial#   Date of purchase
111       01-Jun-2018
222       13-Jan-2018
333       (Blank)
444       (Blank)
555       11-Dec-2017

表 2

Serial Number   purchase date
333             03-Feb-2019
444             19-Feb-2019

我是 Pandas 的新手,第一次尝试使用 Pandas 制作 Python 脚本来实现这一点。这是我设法编写但无法正常工作的代码。

import xlrd
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile

df1 = pd.read_excel('Excel-1.xlsx', sheet_name='Sheet1')
df2 = pd.read_excel('Excel-2.xlsx', sheet_name='Sheet1')

df1['Date of purchase'] = df1['Serial#'].map(df2.set_index('Serial Number')['purchase date'])

错误

pandas.core.indexes.base.InvalidIndexError:重新索引仅对唯一值索引对象有效

编辑:

标签: excelpython-3.xpandas

解决方案


假设您的输入数据是:

In [1]: import pandas as pd

In [2]: sheet1=pd.DataFrame([[111,'01-Jun-2018'],[222,'13-Jan-2018'],[333],[444],[555,'11-Dec-2017']], columns=['Serial#','Date of purchase'])

In [3]: sheet1
Out[3]: 
   Serial# Date of purchase
0      111      01-Jun-2018
1      222      13-Jan-2018
2      333             None
3      444             None
4      555      11-Dec-2017

In [4]: sheet2=pd.DataFrame([[333,'03-Feb-2019'],[444,'19-Feb-2019']],columns=sheet1.columns)

In [5]: sheet2
Out[5]: 
   Serial# Date of purchase
0      333      03-Feb-2019
1      444      19-Feb-2019

您可以通过索引数据框并使用fillna方法来继续:

In [6]: sheet1.set_index('Serial#')

In [7]: sheet1['Date of purchase'].fillna(sheet2.set_index('Serial#')['Date of purchase'], inplace=True)

In [8]:

Out[8]: 
        Date of purchase
Serial#                 
111          01-Jun-2018
222          13-Jan-2018
333          03-Feb-2019
444          19-Feb-2019
555          11-Dec-2017

推荐阅读