转自公众号可以叫我才哥
今天在粉丝交流群里有群友询问了一个已知每个货品的库存,求组合商品(就是多个货品捆绑组合成一个组合商品)的库存量。逻辑上讲,应该是组合商品里货品库存最低的那个货品存量决定整个组合商品的库存量(水桶原理),那么如何实现呢?
事实上,这个计算比较简单,但是里面还是有一些坑,大家可以阅读本例了解一下!
1. 需求分析
咱们先看看原始数据,然后再进行需求拆解。
货品库存数据(去掉了其他无关信息)
![a5cd0514b567df2a5b06506f295e99c0.png](https://img-blog.csdnimg.cn/img_convert/a5cd0514b567df2a5b06506f295e99c0.png)
组合商品数据(库存字段为待求数据)
![6bb6b86564234062e8d2420a2bd1398e.png](https://img-blog.csdnimg.cn/img_convert/6bb6b86564234062e8d2420a2bd1398e.png)
通过看两份原始数据,其实我们都能在脑海里有计算逻辑了,在excel
里先通过vlookup
匹配每个组成商品对应库存量,然后再按照组合商品进行透视分组计算库存量最小值即可。
基于以上思路,大家可以自己试试用excel
透视表进行处理。不过,本文我们也会提供两种方式才进行处理,分别是python
和excel数据合并计算
。
2. 计算过程
我们先介绍用python实现本案例,同样的python实现的方式也有多种,核心思路就是先匹配每个组成商品的库存量,然后再求出分组里各商品库存量最小值即可。
2.1. python计算过程
核心:pandas
的merge
和transform
函数方法
import pandas as pd
# 读取数据
df = pd.read_excel(r'案例数据.xlsx', sheet_name='组合商品')
df1 = pd.read_excel(r'案例数据.xlsx', sheet_name='总库存')
# 由于组合商品中存在空行,所以这里删除,并采用向上填充的方式填充组合商品字段的空值
temp = df.dropna(how='all').ffill()
temp.head()
![14c8a1e7f17b7ebd306cc71875c16fad.png](https://img-blog.csdnimg.cn/img_convert/14c8a1e7f17b7ebd306cc71875c16fad.png)
在组合商品中存在部分组合商品里的其实是同一种商品的N件组合,这种情况下算库存是需要除以N
的,这也是本案例的一个可能踩到的坑。
![ecc6943e46eae63fd9f0e8353a7b07f9.png](https://img-blog.csdnimg.cn/img_convert/ecc6943e46eae63fd9f0e8353a7b07f9.png)
所以,这里我们需要对组合商品字段进行简单的数据分列拆分(可以参考此前推文《一看就会的Pandas文本数据处理》)。
temp['货品编号'] = temp['组成商品'].str.split('*',expand=True)[0]
# 注意货品数量字段类型转换为 数值类型
temp['货品数量'] = temp['组成商品'].str.split('*',expand=True)[1].fillna(1).astype('int')
temp.head()
![8ed5fac63e798465485d18fbabec1317.png](https://img-blog.csdnimg.cn/img_convert/8ed5fac63e798465485d18fbabec1317.png)
接着,我们将每个货品对应库存量匹配上来,用到merge
函数。
# 货品库存预览
df1.sample(5)
![09604374fc5ec06c2b41b94ef2af629f.png](https://img-blog.csdnimg.cn/img_convert/09604374fc5ec06c2b41b94ef2af629f.png)
temp = temp.merge(df1,how='left')
# 由于每个组合商品是多个商品按照一定数量组合的,所以实际库存量应该除以每个货品在组合里的数量
temp['库存量'] = temp['库存量']//temp['货品数量']
temp.head()
![ec5c89fe997aa2144f8b5e562a7a7f5d.png](https://img-blog.csdnimg.cn/img_convert/ec5c89fe997aa2144f8b5e562a7a7f5d.png)
到这里,我们就好处理组合商品的库存了(就是其对应组成商品的库存量最小值)。大家会怎么来计算呢?首先想到的可能是分组或透视的形式,当然这里用到的是transform
,大家可以用别的试试哈。
temp['库存'] = temp.groupby('组合商品')['库存量'].transform('min')
temp.head()
![504bf28fd76a17d65621f207b93feca5.png](https://img-blog.csdnimg.cn/img_convert/504bf28fd76a17d65621f207b93feca5.png)
2.2. excel操作过程
这里也是简单介绍一种操作技巧抛砖引玉,大家可以补充更多方案哈。
先去掉空行
然后将组合商品字段填充
=IF(B3="",A2,B3)
![fb7e00334fc8d2525a832fef2b3836e5.png](https://img-blog.csdnimg.cn/img_convert/fb7e00334fc8d2525a832fef2b3836e5.png)
接着对组合商品表中组成商品分列(按照)*
![aadeda928661e52c2ed9c0c8cb176706.png](https://img-blog.csdnimg.cn/img_convert/aadeda928661e52c2ed9c0c8cb176706.png)
再用vlookup
获取每个组成商品的的库存量
![75208ef087e968c975ffbfbdc70760f2.png](https://img-blog.csdnimg.cn/img_convert/75208ef087e968c975ffbfbdc70760f2.png)
计算对组合商品而言实际库存(除以单组成商品数量)
=ROUNDDOWN(IFERROR(E2/D2,E2),0)
![0ef262d8b683c5534331b1c8cc2c089e.png](https://img-blog.csdnimg.cn/img_convert/0ef262d8b683c5534331b1c8cc2c089e.png)
最后,菜单栏 数据->合并计算 来求值
![9949d3c8a214a137a7186e0aa3986991.png](https://img-blog.csdnimg.cn/img_convert/9949d3c8a214a137a7186e0aa3986991.png)
计算设置
![f7426de2f67c7d6b7d0782ddaf8f8138.png](https://img-blog.csdnimg.cn/img_convert/f7426de2f67c7d6b7d0782ddaf8f8138.png)
结果预览
![2e4b5906f765ae8daa83c0f71f6f697f.png](https://img-blog.csdnimg.cn/img_convert/2e4b5906f765ae8daa83c0f71f6f697f.png)
以上就是一种excel
的操作技巧,这里用到的是数据->合并计算!!
3. 总结
其实,本案例实际上并没有什么难度,而且我们的解决方案也有很多种,核心思路就是匹配+分组的思想。大家可以基于此,结合自己对工具的理解,试试更多种解法来强化哈!
案例数据大家可以扫描下方二维码添加好友,并回复:电商笔试,获取数据。
长按识别二维码