Pandas DataFrame分组聚合问题:合并行计算均值与求和
解决分组聚合时指定不同列计算需求的问题
我来帮你搞定这个问题!看起来你是在分组聚合的时候没给不同列指定对应的聚合函数,所以才会不小心把stud也算出平均值啦。咱们一步步来修正:
首先,先把你创建DataFrame的代码修正一下——原代码有几个语法小问题,比如大小写、字符串引号、参数名称,修正后才能正常运行:
import pandas as pd # 修正后的DataFrame创建代码 a = pd.DataFrame( data=[[0,2010,"pu",5,1],[1,2011,"pri",3,10],[2,2010,"pu",2,3],[1,2010,"pri",3,7],[2,2011,"pu",2,8],[0,2011,"pu",1,8],[1,2010,"pri",0,2],[3,2010,"pu",6,3]], columns=["hschool","year","type","grade","stud"] )
接下来按你的需求一步步处理:
- 删除"hschool"列:用
drop()方法指定列名和轴方向即可
# 删除hschool列,得到新的DataFrame df = a.drop("hschool", axis=1)
- 按year和type分组,指定不同列的聚合规则:这里的关键是用
agg()方法,给每个需要计算的列单独指定聚合函数——你需要grade的平均值,stud的总和,直接在agg()里明确说明就行:
# 分组并执行不同的聚合计算 result = df.groupby(["year", "type"]).agg( avg_grade=("grade", "mean"), # 给grade的平均值起个清晰的别名 total_stud=("stud", "sum") # 给stud的总和起别名 ) # 打印结果看看 print(result)
运行后你会得到这样的结果:
avg_grade total_stud year type 2010 pu 4.333333 7 pri 1.500000 9 2011 pu 1.500000 16 pri 3.000000 10
如果你习惯用字典的写法,也可以这样写,效果是一样的:
result = df.groupby(["year", "type"]).agg({ "grade": "mean", "stud": "sum" })
为什么之前会出错?
如果你之前用的是groupby(["year", "type"]).mean(),Pandas会默认对所有数值型列执行平均值计算,所以stud列也被算出了平均值。而用agg()指定每个列的聚合函数,就能精准控制每一列的计算逻辑啦。
内容的提问来源于stack exchange,提问作者MTT
相关产品推荐
相关产品推荐

