先来看一个实例问题。python
以下销售数据中展示了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例。例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.97) = 40.93%
。web
后台回复“transform”获取本文所有代码和pdf版本。api
思路一:
常规的解法是,先用对订单id分组,求出每笔订单的总金额,再将源数据和获得的总金额进行“关联”。最后把相应的两列相除便可。相应的代码以下:微信
1.对订单id分组,求每笔订单总额。因为有三个order
,所以最终会产生三条记录表示三个总金额。app
2.数据关联合并ide
为了使每行都出现相应order的总金额,须要使用“左关联”。咱们使用源数据在左,聚合后的总金额数据在右(反过来也可)。不指定链接key,则会自动查找相应的关联字段。因为是多行对一行的关联,关联上的就会将总金额重复显示屡次,恰好符合咱们后面计算的须要。结果如上图所示。
函数
3.计算占比学习
有了前面的基础,就能够进行最终计算了:直接用商品金额ext_price
除以订单总额sum_price
。并赋值给新的列pct
便可。url
4.格式调整
为了美观,能够将小数形式转换为百分比形式,自定义函数便可实现。
思路二:
对于上面的过程,pandas中的transform
函数提供了更简洁的实现方式,以下所示:
能够看到,这种方法把前面的第一步和第二步合成了一步,直接获得了sum_price
列。这就是transform
的核心:做用于groupby
以后的每一个组的全部数据。能够参考下面的示意图帮助理解:
后面的步骤和前面一致。
这种方法在须要对多列分组的时候一样适用。
多列分组使用transform
为演示效果,咱们虚构了以下数据,id,name,cls为维度列。
咱们想求:以(id,name,cls)
为分组,每组stu的数量占各组总stu的比例。使用transform
处理以下:
一样再次计算占比和格式化,获得最终结果:
总结transform的用法
transform
函数的官方文档签名为:DataFrame.transform(func,axis=0,*args,**kwargs)
,表示调用func
函数进行转换,返回转换后的值,且返回值与原来的数据在相同的轴上具备相同的长度。func
能够是函数,字符串,列表或字典。具体能够参考官方文档:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.transform.html#pandas.DataFrame.transform。
transform
既能够和groupby
一块儿使用,也能够单独使用。
1.单独使用
此时,在某些状况下能够实现和apply
函数相似的结果。
2.与groupby一块儿使用
此时,transform函数返回与原数据同样数量的行,并将函数的结果分配回原始的dataframe。也就是说返回的shape是(len(df),1)
。本文开头的例子就是这样。而apply
函数返回聚合后的行数。例如:
transform
和apply
的另外一个区别是,apply
函数能够同时做用于多列,而transform
不能够。下面用例子说明:
上图中的例子,定义了处理两列差的函数,在groupby以后分别调用apply
和transform
,transform并不能执行。若是不采用groupby
,直接调用,也会有问题,参见下面的第二种调用方式。
第三种调用调用方式修改了函数,transform
依然不能执行。以上三种调用apply的方式处理两列的差,换成transform
都会报错。
利用transform
填充缺失值
transform
另外一个比较突出的做用是用于填充缺失值。举例以下:
在上面的示例数据中,按照name能够分为三组,每组都有缺失值。用平均值填充是一种处理缺失值常见的方式。此处咱们可使用transform对每一组按照组内的平均值填充缺失值。
小结:
transform
函数常常与groupby
一块儿使用,并将返回的数据从新分配到每一个组去。利用这一点能够方便求占比和填充缺失值。但须要注意,相比于apply
,它的局限在于只能处理单列的数据。
后台回复“transform”获取本文所有代码和pdf版本。
Reference:
https://www.codenong.com/19966018/
https://www.cnblogs.com/junge-mike/p/12761227.html
https://blog.csdn.net/qq_40587575/article/details/81204514
https://pbpython.com/pandas_transform.html

以清净心看世界;
用欢喜心过生活。
超哥的杂货铺,你值得拥有~
长按二维码关注咱们
推荐阅读
本文分享自微信公众号 - 超哥的杂货铺(gh_a624b94bfdab)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。