如何用Pandas按Group分组添加Cost列的分组求和列?
在Pandas中实现分组求和并添加合并列显示
当然可行!作为Pandas新手,这个需求其实可以通过两步轻松实现:先计算每个分组的Cost求和值并添加为新列,再通过样式设置实现你想要的合并单元格显示效果。下面是具体步骤:
1. 构造示例数据集
首先我们先把你提供的数据转换成Pandas DataFrame:
import pandas as pd # 构造数据集 data = { 'Group': ['G1', 'G2', 'G3', 'G3', 'G4', 'G5', 'G5', 'G5'], 'Cost': [1574, 1322, 1188, 942, 838, 5, 4, 3], 'Name1': ['N1A', 'N1B', 'N1C', 'N1D', 'N1E', 'N1F', 'N1F', 'N1G'], 'Name2': ['N2A', 'N2B', 'N2C', 'N2D', 'N2E', 'N2F', 'N2G', 'N2H'] } df = pd.DataFrame(data)
2. 添加分组求和的Sum列
这里我们用groupby结合transform方法,它会把每个分组的求和结果广播到该分组的每一行,完美匹配你的需求:
# 按Group分组计算Cost的求和,添加为Sum列 df['Sum'] = df.groupby('Group')['Cost'].transform('sum') # 调整列顺序,让Sum列移到Cost前面,和你期望的结果一致 df = df[['Group', 'Sum', 'Cost', 'Name1', 'Name2']]
此时你的DataFrame已经拥有了正确的Sum值,但默认打印时还不会合并相同分组的单元格,接下来我们处理显示样式。
3. 设置合并单元格的显示样式
如果需要像你给出的示例那样合并相同Group和Sum的单元格,可以使用Pandas的Styler工具(适合在Jupyter Notebook或网页中展示):
def merge_group_cells(df): # 创建样式对象 styler = df.style # 设置单元格居中对齐 styler.set_table_styles([ {'selector': 'th, td', 'props': [('text-align', 'center')]} ]) # 隐藏索引列,匹配示例格式 styler.hide(axis='index') # 对Group和Sum列,相同值的单元格隐藏顶部边框,实现视觉上的合并 for col in ['Group', 'Sum']: styler.apply( lambda series: [ 'border-top: none' if i > 0 and series.iloc[i] == series.iloc[i-1] else '' for i in range(len(series)) ], subset=col ) return styler # 展示处理后的表格 merge_group_cells(df)
补充说明
- 如果只需要数据层面的Sum列(不需要合并显示的视觉效果),完成前两步就足够了,此时的DataFrame已经包含了正确的分组求和值。
transform是这里的关键:它和agg不同,agg只会返回每个分组的一行结果,而transform会保留原DataFrame的行数,把分组计算结果对应到每一行。
内容的提问来源于stack exchange,提问作者Mexyn
相关产品推荐
相关产品推荐

