一定要收藏,谷歌python高级工程师解一道反常的 pandas 题(附源数据和代码,有资料分享)

在现在社会需求比较多的python中,包含了大量的用来处理社会各行各业的难题的模块,这些模块简化了我们的工作内容,提升了我们的工作效率,并且使用非常简单

比方说pandas这个模块,潘大师(Pandas)基础教程和实战案例有很多,常见的操作主要有增、删、改、查,很多人在学习的时候稍微看一下视频+多练习基本上都能掌握的差不多。

 

但是,实际业务场景,由于各种原因,总会有一些反常的需求。比方说有粉丝在我的公众号后台给我提了这样的一个需求,在我看来是相当有代表性的,常规的文章或者论坛是不会涉及到此类问题的解决方案的,所以在这里跟大家进行分享(为了供大家自己实战练手。也为大家准备了相关数据,数据完全脱敏处理,可以放心练习使用)

需求背景

有两张表,A表记录了很多款产品的三个基础字段,分别是产品ID,地区代码和重量:

图片

B表是运费明细表,这个表结构很“业务”。每行对应着单个地区,不同档位重量,所对应的运费:

 

图片

 

比如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表解构,变成“源数据”格式,问题就全部解决了:

 

图片

 

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

 

下面是动手时刻。

 

具体实现

 

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

 

图片

 

B表(cost):

 

图片

 

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

 

图片

 

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

 

图片

 

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

 

图片

 

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

 

图片

 

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

 

需要把重量区间做拆分,从而和产品重量对比,找到对应的重量区间:

 

图片

 

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

 

图片

 

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

 

图片

 

大功告成~

不知道有没有小伙伴遇到过这样的问题,希望我的解答能够对大家有所帮助,更多相关的内容以后会不断更新,想要获取一手资料的小伙伴,

 

感兴趣的小伙伴可以关注或者可以添加我的微信,领取资料:xxy12311007

 

 

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值