Pandas案例精进 | 结构化数据非等值范围查找 ①

Aidan075
• 阅读 1283

Pandas案例精进 | 结构化数据非等值范围查找 ①

大家好,我是小五🐶

欢迎来到「Pandas案例精进」专栏,点击蓝字查看全部

Pandas案例需求

有两张表,A表记录了很多款产品的三个基础字段,分别是产品ID,地区代码和重量:
Pandas案例精进 | 结构化数据非等值范围查找 ①
B表是运费明细表,这个表结构很“业务”。每行对应着单个地区,不同档位重量,所对应的运费:

Pandas案例精进 | 结构化数据非等值范围查找 ①

比如121地区,0-0.5kg的产品,运费是5.38元;2.01(实际应该是大于1)-3kg,运费则是5.44元。
现在,我们想要结合A表和B表,统计出A表每个产品付多少运费,应该怎么实现?
可以先自己思考一分钟!

解题思路

人海战术

任何数据需求,在人海战术面前都是弟弟。

A表一共215行,我们只需要找215个人,每个人只需要记好自己要统计那款产品的地区代码和重量字段,然后在B表中根据地区代码,找到所在地区运费标准,然后一眼扫过去,就能得到最终运费了。

两个“只需要”,问题就这样easy的解决了。

问题变成了,我还差214个人。

解构战术

通过人海战术,我们其实已经明确了解题的朴素思路:根据地区代码和重量,和B表匹配,返回运费结果。

难点在于,B表是偏透视表结构的,运费是横向分布,用Pandas就算用地区代码匹配,还是不能找到合适的运费区间。

怎么办呢?

如果我们把B表解构,变成“源数据”格式,问题就全部解决了:

Pandas案例精进 | 结构化数据非等值范围查找 ①

转换完成后,和A表根据地区代码做一个匹配筛选,答案就自己跑出来了。
下面是动手时刻。

具体实现

先导入数据,A表(product):

Pandas案例精进 | 结构化数据非等值范围查找 ①

B表(cost):

Pandas案例精进 | 结构化数据非等值范围查找 ①

要想把B表变成“源数据”的格式,关键在于理解stack()堆叠操作,结合示例图比较容易搞懂:

Pandas案例精进 | 结构化数据非等值范围查找 ①

通过stack操作,把多列变为单列多行,原本的2列数据堆成了1列,从而方便了一些场景下的匹配。要变回来也很简单,unstack即可:

Pandas案例精进 | 结构化数据非等值范围查找 ①

在我们的具体场景中,先指定好不变的索引列,然后直接上stack:

Pandas案例精进 | 结构化数据非等值范围查找 ①

这样,就得到了我们目标的源数据。接着,A表和B表做匹配:

Pandas案例精进 | 结构化数据非等值范围查找 ①

值得注意的是,因为我们根据每个地方的重量区间做了堆叠,这里的匹配结果,每个产品保留了对应地区,所有重量区间的价格,离最终结果还有一步之遥。
需要把重量区间做拆分,从而和产品重量对比,找到对应的重量区间:

Pandas案例精进 | 结构化数据非等值范围查找 ①

接着,根据重量的最低、最高区间,判断每一行的重量是否符合区间:

Pandas案例精进 | 结构化数据非等值范围查找 ①

最后,筛选出符合区间的产品,及对应的价格等字段:

Pandas案例精进 | 结构化数据非等值范围查找 ①

大功告成!

本文代码和案例数据

如果大家想自己练手,可以通过以下步骤获取代码及案例数据👇

Pandas案例精进 | 结构化数据非等值范围查找 ①

扫描下方二维码👇添加我的微信(朱小五mini)为好友,然后回复关键词20210311”,关键词是前面的红色数字,建议长按复制!

Pandas案例精进 | 结构化数据非等值范围查找 ①

最后,埋个坑!

我们其实还用了另外**两种**算法进行性能提升,保持关注,我们下期更新!

Pandas案例精进」专栏,点击蓝字查看全部

Pandas案例精进 | 结构化数据非等值范围查找 ①

本文转转自微信公众号凹凸数据原创https://mp.weixin.qq.com/s/p97rbWgpYPhwtS-45bskOA,可扫描二维码进行关注: Pandas案例精进 | 结构化数据非等值范围查找 ① 如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Aidan075 Aidan075
3年前
Pandas案例精进 | 续集:自动分割汇总表写入到子表
(https://imghelloworld.osscnbeijing.aliyuncs.com/0d046e77f6ee65ce132919966585165a.png)大家好!欢迎来到「Pandas案例精进」专栏(https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzU5Nzg5OD
Aidan075 Aidan075
3年前
Pandas案例精进 | 结构化数据非等值范围查找 ②
(https://imghelloworld.osscnbeijing.aliyuncs.com/4971fbce1ecb759123ecc666f3af2c31.png)大家好,我是小五🐶欢迎来到「Pandas案例精进」专栏(https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzU5Nzg
Aidan075 Aidan075
3年前
Pandas案例精进 | 结构化数据非等值范围查找 ③
(https://imghelloworld.osscnbeijing.aliyuncs.com/e6c2856ad5883bc1c88c2f0737ef232e.png)大家好,我是小五🐶欢迎来到👉「Pandas案例精进」专栏(https://mp.weixin.qq.com/mp/appmsgalbum?__bizMz
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这