Pandas GroupBy:仅对部分记录执行聚合操作的实现问题
解决方案:按条件计算聚合总和
没问题,这个需求很容易实现,只需要在计算total_duration时加入条件过滤就行啦!
修改后的代码
import pandas as pd # 先还原你的原始DataFrame示例 df = pd.DataFrame({ 'id': ['001', '001', '001', '002', '002'], 'src': ['A', 'B', 'C', 'B', 'C'], 'target': ['C', 'C', 'C', 'D', 'D'], 'duration': [4, 3, 2, 5, 2] }) # 调整后的聚合逻辑 df_new = df.groupby(['id','target']) \ .apply(lambda x: pd.Series({ 'min_duration': min(x['duration']), # 核心修改:只对src≠target的记录求和 'total_duration': sum(x['duration'][x['src'] != x['target']]), 'all_src': list(x['src']) })).reset_index() print(df_new)
关键说明
- 核心改动在
total_duration的计算:x['duration'][x['src'] != x['target']]会先筛选出当前分组里src和target不相等的行,再对这些行的duration求和。 - 如果需要
min_duration也只考虑src≠target的记录,同样可以套用过滤逻辑:min(x['duration'][x['src'] != x['target']])。
运行结果
执行后得到的df_new会符合你的预期:
id target min_duration total_duration all_src 0 001 C 2 7 [A, B, C] 1 002 D 2 7 [B, C]
比如id=001、target=C的分组里,total_duration只计算了A→C和B→C的时长(4+3=7),自动排除了C→C的那条记录。
内容的提问来源于stack exchange,提问作者Edamame
相关产品推荐
相关产品推荐

