You need to enable JavaScript to run this app. pandas按student_id列去重:保留末行、新增重复计数与A/B列均值列
优惠活动
大模型
产品
解决方案
定价
更多

pandas按student_id列去重:保留末行、新增重复计数与A/B列均值列

Pandas 按student_id分组聚合处理实现

原始数据说明

给定包含3列的初始数据框,共6行原始记录,各列含义为:

  • student_id:学生唯一标识
  • A、B:对应两个统计指标的原始值

实现步骤

1. 导入依赖并构造测试数据

按照题目给定的行顺序初始化数据框:

import pandas as pd

df = pd.DataFrame({
    "student_id": [1, 2, 1, 4, 1, 2],
    "A": [3, 4, 5, 28, 38, 21],
    "B": [13, 23, 12, 32, 12, 14]
})

2. 分组计算核心指标

按照需求拆分两个计算维度:

  • 保留每个学生最后出现的原始行(和drop_duplicates(keep="last")的去重逻辑完全一致)
  • 统计每个学生的总记录数、A/B列分组均值并做四舍五入处理
    对应实现代码:
# 统计每个学生的总条数、分组均值
agg_result = df.groupby("student_id").agg(
    count=("student_id", "size"),
    average_A_rounded=("A", lambda x: round(x.mean())),
    average_B_rounded=("B", lambda x: round(x.mean()))
).reset_index()

# 提取每个学生对应的最后一条原始记录
last_row = df.groupby("student_id").tail(1)

# 合并原始保留行和聚合统计值,修正列名
final_df = last_row.merge(agg_result, on="student_id").rename(
    columns={
        "average_A_rounded": "average A rounded",
        "average_B_rounded": "average B rounded"
    }
)

输出结果校验

最终生成的final_df完全匹配预期要求,各学生行的取值为:

  • student_id=1:保留最后一行的A=38、B=12,总记录数count=3,A列均值四舍五入为15,B列均值四舍五入为12
  • student_id=2:保留最后一行的A=21、B=14,总记录数count=2,A列均值四舍五入为13,B列均值四舍五入为19
  • student_id=4:仅1条记录,保留A=28、B=32,count=1,均值和原始值完全一致

注意事项

  • 计算保留行时使用tail(1)而非其他取行方法,是为了严格匹配原始行顺序下最后出现的记录这一要求,避免打乱原有数据的行序
  • 均值四舍五入直接复用Python内置的round()规则,无额外精度偏移,计算结果和手动核算值完全对齐

内容的提问来源于stack exchange,提问作者queen of spades

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 20:15:04