Pandas groupby结果赋值新列报索引不兼容错误如何解决?
报错原因
你编写的代码等号右侧是两次分组聚合后得到的Series,索引为分组键组成的多级索引(第一级是Class、第二级是Student),行数和索引结构都和原始DataFrame不匹配,因此无法直接插入为新列。
解决方法
有两种常用的实现方案:
方案1:使用transform直接生成对齐的结果(推荐)
transform方法会保留原始DataFrame的索引,返回长度和原表完全一致的计算结果,直接赋值即可:
# 计算每个班级下每个学生的总得分,结果和原df行数一致 student_total = df.groupby(['Class', 'Student'])['Score'].transform('sum') # 计算每个班级的总得分,结果和原df行数一致 class_total = df.groupby(['Class'])['Score'].transform('sum') # 计算占比 df['share'] = student_total / class_total
也可以合并成一行写:
df['share'] = df.groupby(['Class', 'Student'])['Score'].transform('sum') / df.groupby(['Class'])['Score'].transform('sum')
方案2:先聚合再映射回原表
如果需要保留中间聚合结果,可以先计算聚合值再通过merge关联回原表:
# 计算每个班级每个学生的总得分 stu_agg = df.groupby(['Class', 'Student'], as_index=False)['Score'].sum().rename(columns={'Score': 'stu_total'}) # 计算每个班级的总得分 class_agg = df.groupby(['Class'], as_index=False)['Score'].sum().rename(columns={'Score': 'class_total'}) # 关联聚合结果到原表 df = df.merge(stu_agg, on=['Class', 'Student']).merge(class_agg, on=['Class']) # 计算占比 df['share'] = df['stu_total'] / df['class_total']
内容的提问来源于stack exchange,提问作者Chipmunk_da
相关产品推荐
相关产品推荐

