如何用Pandas实现R中data.table的分组条件求和并保留原表行数?
Pandas实现分组条件求和并添加新列的简洁方法
完全可以用groupby.transform直接实现,不用先分组计算再合并回原表——你之前觉得条件求和没法用transform,其实是没找对正确的写法。
这里给两种简洁的实现方式,都能直接生成和原表行数一致的新列:
方法1:在transform中用lambda做组内条件筛选求和
import pandas as pd # 准备示例数据 df = pd.DataFrame({ 'id': [1, 1, 2, 2, 3], 'category': ['cat1', 'cat2', 'cat1', 'cat1', 'cat2'], 'amount': [10, 20, 30, 40, 50] }) # 核心代码:按id分组,筛选组内category为cat1的amount求和,结果广播到原表每一行 df['cat1_total'] = df.groupby('id')['amount'].transform( lambda x: x[df.loc[x.index, 'category'] == 'cat1'].sum() )
方法2:构造条件乘积后用transform求和(逻辑更直观)
先把category的匹配条件转为布尔值,和amount相乘后再求和,可读性更强:
# 直接在transform里完成条件判断与求和 df['cat1_total'] = df.groupby('id').transform( lambda g: (g['amount'] * (g['category'] == 'cat1')).sum() )
两种方法运行后,原表都会新增cat1_total列:每一行对应其所在id组内所有category为cat1的amount总和,比如id=1的两行都会显示10,id=2的两行显示70,id=3的行显示0。
内容的提问来源于stack exchange,提问作者abudis
相关产品推荐
相关产品推荐

