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

Aidan075
• 阅读 1010

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案例精进 | 结构化数据非等值范围查找 ① 如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
浅梦一笑 浅梦一笑
5个月前
初学 Python 需要安装哪些软件?超级实用,小白必看!
编程这个东西是真的奇妙。对于懂得的人来说,会觉得这个工具是多么的好用、有趣,而对于小白来说,就如同大山一样。其实这个都可以理解,大家都是这样过来的。那么接下来就说一下python相关的东西吧,并说一下我对编程的理解。本人也是小白一名,如有不对的地方,还请各位大神指出01名词解释:如果在编程方面接触的比较少,那么对于软件这一块,有几个名词一定要了解,比如开发环
blmius blmius
1年前
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
Wesley13 Wesley13
1年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Easter79 Easter79
1年前
vue+element 表格formatter数据格式化并且插入html标签
前言   vue中element框架,其中表格组件,我既要行内数据格式化,又要插入html标签一贯思维,二者不可兼得也一、element表格数据格式化  !(https://oscimg.oschina.net/oscnet/3c43a1cb3cbdeb5b5ad58acb45a42612b00.p
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
1年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Stella981 Stella981
1年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Stella981 Stella981
1年前
Angular material mat
IconIconNamematiconcode_add\_comment_addcommenticon<maticonadd\_comment</maticon_attach\_file_attachfileicon<maticonattach\_file</maticon_attach\
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
helloworld_34035044 helloworld_34035044
8个月前
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为