如何将groupby聚合结果添加至原DataFrame对应组尾新列
按组求和并仅在每组末尾显示结果的实现方案
给定初始DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'A':[1,1,2,2],'values':np.arange(10,30,5)})
需求是:按列A分组计算values的求和值,将结果存入新列sum_values_A,且仅在每组的最后一行显示该求和值,其余行填充NaN。
你尝试的代码无法实现需求,因为groupby('A')['sum_values_A'].unique()会将每组转换为单个值的Series,无法与原DataFrame的行索引对齐,导致赋值失败。
以下是两种可行的实现方式:
方法一:定位每组最后一行赋值
先初始化新列为NaN,再计算每组求和值并仅赋值给每组的最后一行:
# 初始化新列为NaN df['sum_values_A'] = np.nan # 获取每组最后一行的索引,赋值对应组的求和值 group_sums = df.groupby('A')['values'].sum() last_rows_idx = df.groupby('A').tail(1).index df.loc[last_rows_idx, 'sum_values_A'] = group_sums.values
方法二:结合transform与cumcount筛选
先通过transform得到每组的求和值,再利用cumcount判断是否为每组最后一行,保留对应值并将其他行设为NaN:
# 先得到每组的求和值,填充到所有行 df['sum_values_A'] = df.groupby('A')['values'].transform('sum') # 筛选出每组非最后一行的行,将对应sum_values_A设为NaN df.loc[~df.groupby('A').cumcount(ascending=False).eq(0), 'sum_values_A'] = np.nan
执行上述任意一种方法后,得到的DataFrame结果如下:
A values sum_values_A 0 1 10 NaN 1 1 15 25.0 2 2 20 NaN 3 2 25 45.0
内容的提问来源于stack exchange,提问作者meg hidey
相关产品推荐
相关产品推荐

