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

Python进阶者
• 阅读 479

大家好,我是皮皮。

一、前言

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

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

二、解决过程

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

方法一:使用自定义函数

代码如下:

import pandas as pd

lv = [1, 2, 2, 3, 3, 4, 2, 3, 3, 3, 3]
num = [122, 111, 222, 444, 555, 555, 333, 666, 666, 777, 888]
df = pd.DataFrame({'lv': lv, 'num': num})

def demean(arr):
    return arr - arr.mean()
# 按照"lv"列进行分组并计算出"num"列每个分组的平均值,然后"num"列内的每个元素减去分组平均值
df["juncha"] = df.groupby("lv")["num"].transform(demean)
print(df

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

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

方法二:使用内置函数

代码如下:

import pandas as pd

lv = [1, 2, 2, 3, 3, 4, 2, 3, 3, 3, 3]
num = [122, 111, 222, 444, 555, 555, 333, 666, 666, 777, 888]
df = pd.DataFrame({'lv': lv, 'num': num})

gp_mean = df.groupby('lv')["num"].mean().rename("gp_mean").reset_index()
df2 = df.merge(gp_mean)
df2["juncha"] = df2["num"] - df2["gp_mean"]
print(df2)

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

方法三:使用 transform

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

import pandas as pd

lv = [1, 2, 2, 3, 3, 4, 2, 3, 3, 3, 3]
num = [122, 111, 222, 444, 555, 555, 333, 666, 666, 777, 888]
df = pd.DataFrame({'lv': lv, 'num': num})

# 方法三: 使用 transform。
df["gp_mean"] = df.groupby('lv')["num"].transform('mean')
df["juncha"] = df["num"] - df["gp_mean"]
print(df)
# 直接输出结果,省略分组平均值列
df["juncha"] = df["num"] - df.groupby('lv')["num"].transform('mean')
print(df)

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

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

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

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

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

三、总结

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

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

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

点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
2年前
多张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进阶者
1年前
怎么用Python把左边这种转成右边这种?
大家好,我是皮皮。一、前言前几天在Python白银交流群【惜君】问了一个Pandas处理Excel的问题,这里拿出来给大家分享下。下面是粉丝自己写的代码:二、实现过程看上去是分组,聚合。这里【此类生物】提出使用.sum().unstack()方法,可以得到
Python进阶者 Python进阶者
1年前
盘点一个`07Apr2022`格式日期转换的基础题目
大家好,我是皮皮。一、前言前几天在Python星耀交流群有个叫【wangning】的粉丝问了一道Python日期转换的问题,这里拿出来给大家分享下,一起学习下。二、解决过程【瑜亮老师】解答这里给出了一个比较笨拙的方法,但是确实行之有效,使用了字符串处理字典处理的方法。defchange(d):monthdict"Apr":
Wesley13 Wesley13
2年前
mysql——GROUP BY和HAVING
GROUPBY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。select子句中的列名必须为分组列或列函数,列函数对于groupby子句定义的每个组返回一个结果。某个员工信息表结构和数据如下:  id  name  dept  salary  edlevel     hiredate   1  张
Python进阶者 Python进阶者
11个月前
我让gpt写了一段正则表达式代码,可是运行报错,可以帮忙看看哪里出了问题?
大家好,我是皮皮。一、前言前几天在Python最强王者群【HZL】问了一个Python正则表达式的问题,这里拿出来给大家分享下。截图如下图所示:单独跑的这一行,跑出了下图这个。这个报错是你提取了4列,应该赋值给4列,而不应该是1列。二、实现过程这里【大锤子
Python进阶者 Python进阶者
8个月前
盘点一个pandas读取excel数据并处理的小需求
大家好,我是皮皮。一、前言前几天在Python最强王者群【wen】问了一个pandas数据处理的问题,一起来看看吧。通过pandas读取excel数据,其中两列是交易的备注信息,对A列数据筛选并把结果输出到C列。如果A列中有二、实现过程这里【东哥】给了一个
Python进阶者 Python进阶者
6个月前
请问第一列index怎么可以向下填充?
大家好,我是皮皮。一、前言前几天在Python铂金群【gyx】问了一个Python索引的问题,一起来看看吧。请问第一列index怎么可以向下填充?二、实现过程后来【瑜亮老师】给了一个建议,如下所示:顺利地解决了粉丝的问题。三、总结大家好,我是皮皮。这篇文章
Python进阶者 Python进阶者
2年前
把一个csv数据文件,第一行头文件(字段名)不变,按某列(第四列)降序排列,另行保存为csv 文件
大家好,我是皮皮。一、前言前几天在Python白银交流群有个叫【大侠】的粉丝问了一个关于Python自动化办公的问题,这里拿出来给大家分享下,一起学习。把一个csv数据文件,第一行头文件(字段名)不变,按某列(第四列)降序排列,另行保存为csv文件。二、解决过程【dcpeng】解答这里给出了一个思路,传统的常规思路,虽然很low,但是可行。【德善堂
Python进阶者 Python进阶者
2年前
盘点Pandas中csv文件读取的方法所带参数usecols知识
大家好,我是皮皮。一、前言前几天在Python最强王者群有个叫【老松鼠】的粉丝问了一个关于Pandas中csv文件读取的方法所带参数usecols知识问题,这里拿出来给大家分享下,一起学习。其实usecols参数是指定列读取。二、解决过程下面是【德善堂小儿推拿瑜亮老师】大佬解答:举个栗子,就像你手中只有常见的人民币面值,让你把面值等于5元,10元,100
Python进阶者 Python进阶者
1年前
盘点一道字典转换基础题目
大家好,我是皮皮。一、前言前几天在Python最强王者交流群有个叫【麦当】的粉丝问了一个Python基础问题,这里拿出来给大家分享下,一起学习下。二、解决过程这个问题挺基础的,看上去确实也不难。这里【瑜亮老师】直接给了一个代码d'a':1,'b':2reslist(tuple(d.items()))print(res)后来【月神】发现,其实