You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:11:04