You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"]
)

接下来按你的需求一步步处理:

  1. 删除"hschool"列:用drop()方法指定列名和轴方向即可
# 删除hschool列,得到新的DataFrame
df = a.drop("hschool", axis=1)
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:23:20