专栏首页超哥的杂货铺Pandas tricks 之 transform的用法

Pandas tricks 之 transform的用法

先来看一个实例问题。

如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例。例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.97) = 40.93%

后台回复“transform”获取本文全部代码和pdf版本。

思路一:

常规的解法是,先用对订单id分组,求出每笔订单的总金额,再将源数据和得到的总金额进行“关联”。最后把相应的两列相除即可。相应的代码如下:

1.对订单id分组,求每笔订单总额。由于有三个order,因此最终会产生三条记录表示三个总金额。

2.数据关联合并

为了使每行都出现相应order的总金额,需要使用“左关联”。我们使用源数据在左,聚合后的总金额数据在右(反过来也可)。不指定连接key,则会自动查找相应的关联字段。由于是多行对一行的关联,关联上的就会将总金额重复显示多次,刚好符合我们后面计算的需要。结果如上图所示。

3.计算占比

有了前面的基础,就可以进行最终计算了:直接用商品金额ext_price除以订单总额sum_price。并赋值给新的列pct即可。

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函数返回聚合后的行数。例如:

transformapply的另一个区别是,apply函数可以同时作用于多列,而transform不可以。下面用例子说明:

上图中的例子,定义了处理两列差的函数,在groupby之后分别调用applytransform,transform并不能执行。如果不采用groupby,直接调用,也会有问题,参见下面的第二种调用方式。

第三种调用调用方式修改了函数,transform依然不能执行。以上三种调用apply的方式处理两列的差,换成transform都会报错。

利用transform填充缺失值

transform另一个比较突出的作用是用于填充缺失值。举例如下:

在上面的示例数据中,按照name可以分为三组,每组都有缺失值。用平均值填充是一种处理缺失值常见的方式。此处我们可以使用transform对每一组按照组内的平均值填充缺失值。

小结:

transform函数经常与groupby一起使用,并将返回的数据重新分配到每个组去。利用这一点可以方便求占比和填充缺失值。但需要注意,相比于apply,它的局限在于只能处理单列的数据。

本文分享自微信公众号 - 超哥的杂货铺(gh_a624b94bfdab),作者:程恒超

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • matplotlib绘制常见统计图形(一)

    之前的文章一图入门Matplotlib绘图中我们学习了matplotlib中常见图表元素的绘制方法,所有操作都通过可以调用plt的函数实现。本节继续来学习使用m...

    超哥的杂货铺
  • 不再纠结,一文详解pandas中的map、apply、applymap、groupby、agg...

    pandas提供了很多方便简洁的方法,用于对单列、多列数据进行批量运算或分组聚合运算,熟悉这些方法后可极大地提升数据分析的效率,也会使得你的代码更加地优雅简洁。...

    超哥的杂货铺
  • MacOS 下hive的安装与配置

    之前的文章中我们提到了Hive是Hadoop生态系统中的重要的成员之一,允许用户使用类似SQL的方式,很方便地进行离线数据的统计分析。本节我们就在Hadoop集...

    超哥的杂货铺
  • translateX()——动画示例

    Html5知典
  • translateY()——动画示例

    Html5知典
  • CSS3 transform对元素的影响

    我们可能都知道这样一个规则,当遭遇元素margin负值重叠的时候,如果没有static以外的position属性值的话,后面的元素是会覆盖前面的元素的。例如下面...

    javascript.shop
  • 十二、面向对象实战之封装拖拽对象

    前面几篇文章,我跟大家分享了JavaScript的一些基础知识,这篇文章,将会进入第一个实战环节:利用前面几章的所涉及到的知识,封装一个拖拽对象。为了能够帮助大...

    用户6901603
  • Flash:DisplayObject的transform/matrix的潜规则、小bug

    用户1258909
  • Shell下制作自解压安装包,实现脚本的简单加密

    一、原理阐述 在 linux 下可以用几个最基本的命令制作一个自解压的程序。其原理是:利用 cat 命令可以将两个文件连起来(用>>追加也能达到同样效果),前一...

    张戈
  • 用傻瓜式编程搞定大数据分析

    “零编码”运动由比尔·盖茨发起,史蒂芬·乔布斯对其进行了完善。这项运动正逐渐延伸到资本市场。1979年,在乔布斯参观帕洛阿尔托研究所中,当他看到 了命令行界面...

    CDA数据分析师

扫码关注云+社区

领取腾讯云代金券