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
相关产品推荐
相关产品推荐

