Pandas中的 transform()结合 groupby()用法示例详解

作者:cnhwl 时间:2023-01-26 10:00:09 

首先,假设我们有如下餐厅数据集:


import pandas as pd

df = pd.DataFrame({
 'restaurant_id': [101,102,103,104,105,106,107],
 'address': ['A','B','C','D', 'E', 'F', 'G'],
 'city': ['London','London','London','Oxford','Oxford', 'Durham', 'Durham'],
 'sales': [10,500,48,12,21,22,14]
})

Pandas中的 transform()结合 groupby()用法示例详解

如果我们想知道:每个餐厅在城市中所占的销售额百分比是多少?预期得到的输出是:

Pandas中的 transform()结合 groupby()用法示例详解

相比于原来的数据集,多了两列,分别是某个城市所有餐厅的销售总额,以及每个餐厅在城市中所占的销售额百分比。解决方案有两个:

方案一(较麻烦):

1、使用 groupby('city') 基于城市进行分组,对于这些组中的每一个组,选中其销售额列 ['sales'],然后使用函数 apply(sum) 或者sum() 对城市的销售额进行求和。

之后,新列被重命名为 city_total_sales 并且索引被重置(注意不能漏了 reset_index() ,因为 groupby('city') 生成的索引是城市,而我们希望城市作为普通列)。


city_sales = df.groupby('city')['sales']
            .sum().rename('city_total_sales').reset_index()

得到的 city_sales 如下:

Pandas中的 transform()结合 groupby()用法示例详解

2、用 merge() 函数把 city_sales 合并回去,得到的 df_new 如下:


df_new = pd.merge(df, city_sales, how='left')

Pandas中的 transform()结合 groupby()用法示例详解
3、最后,求百分比并保留两位小数,结果如下:


df_new['pct'] = df_new['sales'] / df_new['city_total_sales']
df_new['pct'] = df_new['pct'].apply(lambda x: format(x, '.2%'))

Pandas中的 transform()结合 groupby()用法示例详解

方案二(便捷):

1
transform() 函数在执行转换后保留与原始数据集相同数量的项目。因此,使用 groupby() 然后使用 transform(sum) 会返回相同的输出,结果如下图:


df['city_total_sales'] = df.groupby('city')['sales']
                          .transform('sum')

代码翻译过来就是:数据集基于城市进行分组,然后选定销售额列,对每组的销售额进行求和,返回一个和原列长度一样的新列

Pandas中的 transform()结合 groupby()用法示例详解

2

与方案一相同。


df['pct'] = df['sales'] / df['city_total_sales']
df['pct'] = df['pct'].apply(lambda x: format(x, '.2%'))

总结:可以看出,在对 DataFrame 进行分组 groupby() 之后,如果是使用 apply() 或者直接使用某个统计函数,得到的新列的长度与分组得到的组数是一样的;而如果使用 transform()得到的新列与 DataFrame 中列的长度是一样的

来源:https://blog.csdn.net/cnhwl/article/details/120169278

标签:Pandas,groupby(),transform()
0
投稿

猜你喜欢

  • Python中的异常处理讲解

    2023-01-29 11:22:57
  • 用ASP和SQL语句动态的创建Access表

    2008-10-14 16:59:00
  • asp简单可逆运算字符串加密解密函数

    2010-05-04 16:42:00
  • python数据可视化JupyterLab实用扩展程序Mito

    2021-01-24 13:42:04
  • python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法

    2023-04-03 04:19:06
  • mysql5.6.19下子查询为什么无法使用索引

    2024-01-15 01:04:29
  • 完美解决webstorm启动索引文件卡死的问题

    2022-04-05 05:52:29
  • vantUI 获得piker选中值的自定义ID操作

    2024-04-10 13:48:42
  • 如何利用SQL Server来发送电子发邮件?

    2010-01-01 15:37:00
  • ASP中3种分页显示的性能比较

    2007-08-15 13:37:00
  • 如何修改vue-treeSelect的高度

    2024-05-08 09:33:55
  • JavaScript中Infinity(无穷数)的使用和注意事项

    2023-08-21 00:59:13
  • python检测文件夹变化,并拷贝有更新的文件到对应目录的方法

    2023-11-07 12:56:06
  • 使用django的objects.filter()方法匹配多个关键字的方法

    2022-04-08 06:11:20
  • 成功解决ValueError: Supported target types are:('binary', 'multiclass'). Got 'continuous' instead.

    2023-01-24 03:59:00
  • python热力图实现的完整实例

    2023-03-02 17:10:35
  • python networkx 包绘制复杂网络关系图的实现

    2021-03-27 06:11:39
  • JQuery+DIV自定义滚动条样式的具体实现

    2024-04-22 13:27:07
  • python3定位并识别图片验证码实现自动登录功能

    2022-07-23 13:23:59
  • MySQL一键安装Shell脚本的实现

    2024-01-16 23:28:29
  • asp之家 网络编程 m.aspxhome.com