查看原文
其他

如何理解pandas中的transform函数

大邓 大邓和他的Python 2022-07-09

transform函数一直没懂,直到看到这篇文章 UnderstandingtheTransformFunctioninPandas, 假设我们有下面的销售数据,有三个不同的 订单id (10001, 10005和10006),每个 订单id又含有多个产品。

  1. import pandas as pd


  2. df = pd.read_excel("sales_transactions.xlsx")

  3. df

问题

每个订单中各个单品费用分布及占比

例如,订单10001总价$576.12,细分一下

  1. B1-20000 = $235.83 or 40.9%

  2. S1-27722 = $232.32 or 40.3%

  3. B1-86481 = $107.97 or 18.7%

如果还是没看懂,直接看代码吧。通过代码理解,比看大邓唠叨更有效果。

Talk is cheep, show me your code

第一种方法-merge

如果熟悉pandas的话,应该先试图对dataframe进行groupby

  1. df.groupby('order')['ext price'].sum()

Run

  1. order

  2. 10001 576.12

  3. 10005 8185.49

  4. 10006 3724.49

  5. Name: ext price, dtype: float64

现在的难点是如何将刚刚分析出的数据与原始数据加工到一起,因为新旧数据的长度是不一样的。

最直接的方法就是新建一个dataframe

  1. order_total = df.groupby('order')['ext price'].sum().rename('Order_Total').reset_index()

  2. df_1 = df.merge(order_total)

  3. df_1['Percent_of_Order'] = df_1['ext price']/df_1['Order_Total']

  4. df_1

第二种方法- transform

使用原始dataframe,让我们看看经过transform与groupby处理后,我们得到的都是什么

  1. df.groupby('order')['ext price'].transform('sum')

Run

  1. 0 576.12

  2. 1 576.12

  3. 2 576.12

  4. 3 8185.49

  5. 4 8185.49

  6. 5 8185.49

  7. 6 8185.49

  8. 7 8185.49

  9. 8 3724.49

  10. 9 3724.49

  11. 10 3724.49

  12. 11 3724.49

  13. Name: ext price, dtype: float64

我们发现得到的数据长度与groupby长度不同(长度是3),而与原始数据df的长度是一样的。

所以我们可以一行代码解决本文的问题

  1. df["Percent_of_Order"] = df["ext price"] / df.groupby('order')["ext price"].transform('sum')

  2. df

近期文章

pip安装问题解决办法

Prophet: 时间序列预测库

计算社会经济学

免费视频课《Python快速入门》

初学Python常见异常错误

Python 函数式编程指北,不只是面向对象哦

一行pandas代码生成哑变量

顺利开班 | python爬虫分析2019年杭州国庆工作坊顺利开班

圆满落幕 | Python 爬虫分析杭州国庆工作坊圆满落幕

文本数据分析文章汇总(2016-至今)


课件获取方式,请在公众号后台回复关键词“20191014”,客官如果觉得有收获,顺便那啥一下哈


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存