pandas按ID分组求和后将Rate总额写入Status为P的Total列
Pandas 按ID分组汇总房费并仅填充主住客行的实现方案
原有方案问题
直接调用df.groupby(["ID"]).Rate.sum().reset_index()会按ID维度做聚合,每个ID仅返回1条汇总记录,会丢失同ID下的同住人明细行,自然无法实现按Status条件赋值的需求。
实现思路
使用groupby配套的transform方法做分组求和,该方法会把分组计算出的总和按原表的行索引对齐返回,不会压缩行数、丢失原始记录,之后通过条件判断给Total列赋值即可:
- 按ID分组计算每个房间的总房费,将结果广播到同ID的每一行
- 逐行判断Status值:值为
P的主住客行,Total列填入对应房间总房费;值为S的同住人行,Total列填0
完整代码
import pandas as pd import numpy as np # 原始数据表 df = pd.DataFrame({ 'ID':[1182,2554,1182,2658,5489,2658], 'Fname':['Tom','Harry','Trisha','Ben','Susan','Brenda'], 'Rate':[125.00,89.00,135.00,25.00,145.00,19.00], 'Status':['P','S','P','P','P','S'], 'Total':[0,0,0,0,0,0] }) # 按ID分组计算单房总房费,结果与原表行对齐 df['room_total'] = df.groupby('ID')['Rate'].transform('sum') # 按Status规则给Total列赋值 df['Total'] = np.where(df['Status'] == 'P', df['room_total'], 0) # 清理临时计算列 df = df.drop(columns=['room_total'])
运行上述代码后所有原始记录完整保留,Total列填充逻辑完全匹配需求规则。
内容的提问来源于stack exchange,提问作者Boomer
相关产品推荐
相关产品推荐

