本帖最后由 Hi-Frank 于 2021-6-9 17:17 编辑
用 Python 实现 Excel 的 VLookup 功能
0. 引子
在高铁上,看着祖国大好河山,利用闲暇再来一篇。
在高铁上嘛,就来一篇我们 Excel 圈高大上的 : VLOOKUP
1. 案例说明
还是上一帖的例子。那个有 订单、价格表、供应商 三个 Sheet 的 Excel 文件,如下:
如果要在订单中显示单价,需要 VLookup:
- =VLOOKUP(B2,价格表!$A$1:$C$7,3)
复制代码
我们还可以继续 VLookup,把供应商也查出来,最终结果如下:
2. Python 实现
在 Python 中,和 VLookup 对应的,是一条非常简单的语句,merge()
首先,我们先把这个工作簿中的数据都读过来,放到 Pandas 的 DataFrame 里,分别是 df1, df2, df3:
- df1 = pd.read_excel(r'd:\demo\orders2.xlsx', sheet_name='订单')
- df2 = pd.read_excel(r'd:\demo\orders2.xlsx', sheet_name='价格表')
- df3 = pd.read_excel(r'd:\demo\orders2.xlsx', sheet_name='供应商')
复制代码
然后,我们用 pandas 的 merge() 方法,通过“型号”列,把相关的值读过来:
- df4 = df1.merge(df2, on='型号')
复制代码
结果如下:
简单吧,就这一句: df4 = df1.merge(df2, on='型号')
意思就是,把 df2 以“型号”列为依据,与 df1 合并,得到 df4.
我们还可以再来一句,把供应商也读过来:
- df5 = df4.merge(df3, on='产品')
复制代码 结果如下:
如上,在 df5 中,就得到了上面我们两遍 VLookup 后得到的结果。
3. 更多问题
事情总没有那么简单。每次想着写个短帖子,总会写一堆长篇大论。
比如,这句 df4 = df1.merge(df2, on='型号') ,是因为两个表的这一列都叫“型号”。如果列名不一样呢?
假设这一列,在 订单表 df1 中叫“型号”,在 价格表 df2 中叫 “规格”,那么,语法如下:
- df4 = df1.merge(df2, left_on='型号', right_on='规格')
复制代码
同样,如果 订单表 df1 中的 “产品”,在 供应商表中叫 “商品”,则语法为:
- df5 = df4.merge(df3, left_on='产品', right_on='商品')
复制代码
n. 更多更多问题
问题越来越多啊:
- 上面的结果中,有多余的列,怎么办?
- 怎么只显示需要的列?按需要的顺序显示?
- 如何做计算的列,例如每一行的单价乘数量的小计?合计呢?
- 如何自定义列名?
- 如何把这个结果存回 Excel 文件?或者存入新的文件?
- ......
吾生也有涯,而知也无涯。以有涯随无涯,殆已!
搞这么累干嘛?
趁着还有牙,去吃小龙虾喝啤酒吧。
以上问题,我慢慢讲,不要怕,反正学的越多,问题越多 ......
最后,附上本贴 Demo 的 Jupyter Notebook 文件 和 Excel 文件,供参考。
—— HiFrank 我跑,故我在!
<<< 上一讲:[ Excel-Python ] -4:用 Python 读取 Excel 工作表
http://club.excelhome.net/thread-1587723-1-1.html
下一讲:>>>
[ Excel-Python ] -6:如何用 Python 把数据写入 Excel 文件
http://club.excelhome.net/thread-1588032-1-1.html
|