您的位置: 网站首页> 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。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会

文章评论

    groupby分组计算transform转换返回相同长度序列文章写得不错,值得赞赏

站点信息

  • 网站程序:Laravel
  • 客服微信:a772483200