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

如何在DataFrame按id分组时选取val最大值对应的type并求和val列

实现方案

前置准备

先构造你给出的示例DataFrame:

import pandas as pd

df = pd.DataFrame({
    'id': ['a1', 'a1', 'a1', 'b1', 'b1', 'b1'],
    'type': ['q', 'v', 'l', 'p', 'j', 's'],
    'val': [100, 4, 17, 1, 700, 3]
})

实现方法1:单组聚合直接计算(适合小数据量)

直接在分组agg方法中同时计算最大val对应的type和val总和:

result = df.groupby('id', as_index=False).agg(
    # 取当前分组val最大值对应的type值
    type=('val', lambda x: df.loc[x.idxmax(), 'type']),
    # 对分组内所有val求和
    val=('val', 'sum')
)

实现方法2:排序后合并(性能更优,适合大数据量)

先排序保证每个分组最大值行在前,再分别取type和求和后合并,避免自定义聚合的性能损耗:

# 按val降序排序,每个id分组的第一行即为val最大的行
df_sorted = df.sort_values('val', ascending=False)
# 取每个分组的第一个type
max_type_df = df_sorted.groupby('id', as_index=False)['type'].first()
# 计算每个分组的val总和
val_sum_df = df.groupby('id', as_index=False)['val'].sum()
# 合并得到最终结果
result = pd.merge(max_type_df, val_sum_df, on='id')

两种方法输出的result均符合预期:

id type  val
0  a1    q  121
1  b1    j  704

内容的提问来源于stack exchange,提问作者skulldoger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:05