按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值

大家好,我是皮皮。

一、前言

前几天在Python星耀交流群有个叫【在下不才】的粉丝问了一个Pandas的问题,按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值,这里拿出来给大家分享下,一起学习。

image.png

二、解决过程

这个看上去倒是不太难,但是实现的时候,总是一看就会,一用就废。这里给出【瑜亮老师】的三个解法,一起来看看吧!

方法一:使用自定义函数

代码如下:

1import pandas as pd 2 3lv = [1, 2, 2, 3, 3, 4, 2, 3, 3, 3, 3] 4num = [122, 111, 222, 444, 555, 555, 333, 666, 666, 777, 888] 5df = pd.DataFrame({'lv': lv, 'num': num}) 6 7def demean(arr): 8 return arr - arr.mean() 9# 按照"lv"列进行分组并计算出"num"列每个分组的平均值,然后"num"列内的每个元素减去分组平均值 10df["juncha"] = df.groupby("lv")["num"].transform(demean) 11print(df 12

image.png

1# transform 也支持 lambda 函数,效果是一样的,更简洁一些 2# df["juncha"] = df.groupby("lv")["num"].transform(lambda x: x - x.mean()) 3# print(df)

方法二:使用内置函数

代码如下:

1import pandas as pd 2 3lv = [1, 2, 2, 3, 3, 4, 2, 3, 3, 3, 3] 4num = [122, 111, 222, 444, 555, 555, 333, 666, 666, 777, 888] 5df = pd.DataFrame({'lv': lv, 'num': num}) 6 7gp_mean = df.groupby('lv')["num"].mean().rename("gp_mean").reset_index() 8df2 = df.merge(gp_mean) 9df2["juncha"] = df2["num"] - df2["gp_mean"] 10print(df2) 11

image.png

方法三:使用 transform

transform能返回完整数据,输出的形状和输入一致(输入是num列,输出也是一列),代码如下:

1import pandas as pd 2 3lv = [1, 2, 2, 3, 3, 4, 2, 3, 3, 3, 3] 4num = [122, 111, 222, 444, 555, 555, 333, 666, 666, 777, 888] 5df = pd.DataFrame({'lv': lv, 'num': num}) 6 7# 方法三: 使用 transform。 8df["gp_mean"] = df.groupby('lv')["num"].transform('mean') 9df["juncha"] = df["num"] - df["gp_mean"] 10print(df) 11# 直接输出结果,省略分组平均值列 12df["juncha"] = df["num"] - df.groupby('lv')["num"].transform('mean') 13print(df) 14

image.png

这样问题就完美地解决啦!

image.png

后面他还想用类的方式写,不过看上去没有那么简单。

image.png

三、总结

大家好,我是皮皮。这篇文章主要分享了Pandas处理相关知识,基于粉丝提出的按照A列进行分组并计算出B列每个分组的平均值,然后对B列内的每个元素减去分组平均值的问题,给出了3个行之有效的方法,帮助粉丝顺利解决了问题。

最后感谢粉丝【在下不才】提问,感谢【德善堂小儿推拿-瑜亮老师】给出的具体解析和代码演示,感谢【月神】提供的思路,感谢【dcpeng】等人参与学习交流。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

点赞
收藏

评论区

加载中...

相关推荐

盘点一个`07Apr2022`格式日期转换的基础题目

大家好,我是皮皮。一、前言前几天在Python星耀交流群有个叫【wangning】的粉丝问了一道Python日期转换的问题,这里拿出来给大家分享下,一起学习下。二、解决过程【瑜亮老师】解答这里给出了一个比较笨拙的方法,但是确实行之有效,使用了字符串处理字典处理的方法。defchange(d):monthdict"Apr":

多张excel表做连接,就比如1表有A,B,C列,2表有A,B,D列,我想把A,B,C,D合到一张表

大家好,我是皮皮。一、前言前几天在Python铂金群有个叫【水方人子】的粉丝问了一个关于excel处理的问题,这里拿出来给大家分享下,一起学习。能不能把多张excel表做连接,就比如1表有A,B,C列,2表有A,B,D列,我想把A,B,C,D合到一张表上面,可以吗,就跟数据库左连接一样?二、解决过程一开始想到的方法是Excel中的vlookup函数,确实

怎么用Python把左边这种转成右边这种?

大家好,我是皮皮。一、前言前几天在Python白银交流群【惜君】问了一个Pandas处理Excel的问题,这里拿出来给大家分享下。下面是粉丝自己写的代码:二、实现过程看上去是分组,聚合。这里【此类生物】提出使用.sum().unstack()方法,可以得到

mysql——GROUP BY和HAVING

GROUPBY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。select子句中的列名必须为分组列或列函数,列函数对于groupby子句定义的每个组返回一个结果。某个员工信息表结构和数据如下:  id  name  dept  salary  edlevel     hiredate   1  张

盘点一个pandas读取excel数据并处理的小需求

大家好,我是皮皮。一、前言前几天在Python最强王者群【wen】问了一个pandas数据处理的问题,一起来看看吧。通过pandas读取excel数据,其中两列是交易的备注信息,对A列数据筛选并把结果输出到C列。如果A列中有二、实现过程这里【东哥】给了一个

如何把一个python列表(有很多个元素)变成一个excel表格的第一列?

大家好,我是Python进阶者。一、前言前几天在Python最强王者群有个叫【麦当】的粉丝问了一个关于Python如何把一个python列表(有很多个元素)变成一个excel表格的第一列的问题,这里拿出来给大家分享下,一起学习。二、解决过程这里给出【dcp