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]
})
如果我们想知道:每个餐厅在城市中所占的销售额百分比是多少?预期得到的输出是:
相比于原来的数据集,多了两列,分别是某个城市所有餐厅的销售总额,以及每个餐厅在城市中所占的销售额百分比。解决方案有两个:
方案一(较麻烦):
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
如下:
2、用 merge()
函数把 city_sales
合并回去,得到的 df_new
如下:
df_new = pd.merge(df, city_sales, how='left')
df_new['pct'] = df_new['sales'] / df_new['city_total_sales']
df_new['pct'] = df_new['pct'].apply(lambda x: format(x, '.2%'))
方案二(便捷):
1、transform()
函数在执行转换后保留与原始数据集相同数量的项目。因此,使用 groupby()
然后使用 transform(sum)
会返回相同的输出,结果如下图:
df['city_total_sales'] = df.groupby('city')['sales']
.transform('sum')
代码翻译过来就是:数据集基于城市进行分组,然后选定销售额列,对每组的销售额进行求和,返回一个和原列长度一样的新列。
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
猜你喜欢
- 本文实例讲述了Python实现批量读取图片并存入mongodb数据库的方法。分享给大家供大家参考,具体如下:我的图片放在E:\image\中
- 需要实现的效果选择颜色块或者颜色选择器切换网站主题色,选择主题后保存到本地,下次打开页面是缓存的主题色原理根据ElementUI官网的自定义
- 利用sklearn画出决策树并保存为PDF下载Graphviz进入官网下载并安装:https://graphviz.gitlab.io/_p
- MySQL设置查询缓存的用意:把查询到的结果缓存起来,下次再执行相同查询时就可以直接从结果集中取;这样就比重新查一遍要快的多。查询缓存的最终
- 本文实例讲述了Python实现可获取网易页面所有文本信息的网易网络爬虫功能。分享给大家供大家参考,具体如下:#coding=utf-8#--
- 对于一个给定的字符串,逆序输出,这个任务对于python来说是一种很简单的操作,毕竟强大的列表和字符串处理的一些列函数足以应付这些问题 了,
- 本文实例讲述了Python实现的数据结构与算法之基本搜索。分享给大家供大家参考。具体分析如下:一、顺序搜索顺序搜索 是最简单直观的搜索方法:
- 下面开始构造HTTP数据包,IP层和TCP层使用python的Impacket库,http内容自行填写。#!/usr/bin/env pyt
- 花几分钟时间欣赏一下我们写好的Web应用程序,然后我们再来搞点小破坏。 我们故意在 views.py 文件中引入一项 Python 错误,注
- 这篇论坛文章(赛迪网技术社区)主要介绍了MySQL数据库主从复制的相关概念及设置方法,详细内容请大家参考下文:MySQL支持单向、异步复制,
- 我们可以很轻松的从1到9或者从9到1正着背一遍,反着背一遍。但是想要在编程实现这些看起来简单的操作,就没那么容易了。因为计算机需要一些指令,
- 1.在线定制下载echartshttps://echarts.apache.org/zh/builder.html2.创建一个django项
- random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串。•random.seed(x)改变随机数生成器的种子seed。一般
- renderer是Go语言的一个简单的、轻量的、快速响应的呈现包,它可以支持JSON、JSONP、XML、HYAML、HTML、File等类
- 如何巧用三元表达式一开始我并不喜欢阅读别人的代码,话说程序员最讨厌的事:写代码要写文档、写代码要写注释、别人的代码没有文档、别人的代码没有注
- 本文实例讲述了Python单元测试与测试用例。分享给大家供大家参考,具体如下:单元测试与测试用例简介测试用例是一组单元测试,这些单元测试一起
- axios * 的配置方式本文所用 axios 版本号为:1.3.2。axios 中有两种 * :axios.interceptors.r
- Python实现12306火车票抢票系统效果图如下所示:具体代码如下所示:import urllib.request as request
- 如下所示:import numpy as npnp.set_printoptions(threshold='nan')来源:
- 1. 2D坐标轴1.1 绘制简单的曲线import matplotlib.pyplot as pltimport numpy as npx=