如何在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
相关产品推荐
相关产品推荐

