您的位置: 网站首页> Pandas教程> 当前文章
groupby分组计算transform转换返回相同长度序列
老董-我爱我家房产SEO2022-02-17196围观,125赞
groupby是做分组聚合的,理论上既然分组计算了那么每组会有1个值,这样结果数据的索引长度就减少了,有多少组就代表索引的长度。不过有时候我们分组计算后并不希望减少结果数据的索引长度,比如说有个数据源,里面是不同的班级,求每个班级的学生的最高分,然后新增1列最高分放到原来的表中。
如果想全面了解分组聚合的场景,可以参考文章pandas之groupby使用详解。
比较常见的思路是先根据班级groupby然后应用聚合函数求出最大值,把这个聚合结果再和原来的搬家表进行关联。不过借助transform()函数可以轻松实现这个过程。
1、transform()新增1列和源数据索引长度相同
DataFrameGroupBy对象选取1列(选1列就是SeriesGroupBy对象)来应用transform(func)方法
# -*- coding:UTF-8 -*- import pandas as pd df = pd.DataFrame({'class': ['一班', '二班','一班', '二班'], 'name':['小明','小王','小张','小李'], 'score':[100,9,800,7], }) max_score = df.groupby('class')['score'].transform(max) df['max_score'] = max_score print(df)
class name score max_score 0 一班 小明 100 800 1 二班 小王 9 9 2 一班 小张 800 800 3 二班 小李 7 9
2、DataFrameGroupBy对象应用transform()
DataFrameGroupBy对象应用transform(func)方法时,其函数func传入的参数是源数据分组后每1组的列,与agg方法特点一样。
# -*- coding:UTF-8 -*- import pandas as pd def func(ser_col): value = ser_col.max() - ser_col.min() return value df = pd.DataFrame({'class': ['一班', '二班','一班', '二班'], 'name':['小明','小王','小张','小李'], 'score':[100,9,800,7], }) grouped = df.groupby('class') df = grouped.transform(func) print(df)
score 0 700 1 2 2 700 3 2
以上代码运行可能会出现警告
FutureWarning: Dropping invalid columns in DataFrameGroupBy.transform is deprecated. In a future version, a TypeError will be raised. Before calling .transform, select only columns which should be valid for the transforming function.
这个警告是因为我们传入的函数func内部是做数据运算的,而name列是文本不适合做数值计算,提示你选取有效的列来计算,否则在未来的pandas版本中会报错。这也可以证实上面说的DataFrameGroupBy对象应用transform(func)方法时,其函数func传入的参数是源数据分组后每1组的列。
很赞哦!
python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群
相关文章
文章评论
-
groupby分组计算transform转换返回相同长度序列文章写得不错,值得赞赏
站点信息
- 网站程序:Laravel
- 客服微信:a772483200