如何在groupby操作中/之后合并多行并累加对应数值?
实现特定成绩行的合并与求和
针对你已经通过groupby得到的math_comparison_size(带两级索引的Series),可以通过以下几种方式实现A和A+的合并求和:
方法1:转DataFrame后映射分组
这是最直观的方式,适合需要后续调整其他成绩分组的场景:
# 1. 将原Series转为DataFrame,方便处理 df = math_comparison_size.reset_index(name='Student_Count') # 2. 定义成绩合并规则 grade_mapping = { 'A': 'A/A+', 'A+': 'A/A+' # 其他成绩如B、C等无需映射,会自动保留原名称 } # 3. 生成合并后的成绩列,未映射的成绩保持原样 df['Combined_Grade'] = df['Math.SemGrade'].replace(grade_mapping) # 4. 重新按学术分组和合并后的成绩分组求和 merged_result = df.groupby(['Academic Group', 'Combined_Grade'])['Student_Count'].sum()
方法2:直接在原Series上操作
如果不想转DataFrame,可以直接对索引进行映射后分组:
# 定义成绩合并逻辑 def combine_grade(grade): return 'A/A+' if grade in ('A', 'A+') else grade # 对原Series的第二级索引(成绩)做映射,再分组求和 merged_result = math_comparison_size.groupby( [ math_comparison_size.index.get_level_values(0), # 保留学术分组索引 math_comparison_size.index.get_level_values(1).map(combine_grade) # 映射成绩 ] ).sum()
示例效果
假设你的原math_comparison_size输出为:
Academic Group Math.SemGrade Group A A 7 A+ 21 B 15 Group B A 5 A+ 18 dtype: int64
处理后merged_result会变成:
Academic Group Combined_Grade Group A A/A+ 28 B 15 Group B A/A+ 23 dtype: int64
如果需要将结果硬编码到作业表格中,可以用merged_result.to_markdown()生成Markdown表格格式(需先安装tabulate库:pip install tabulate)。
内容的提问来源于stack exchange,提问作者excpro
相关产品推荐
相关产品推荐

