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

如何在Pandas分组聚合时为指定列应用mode函数

解决分组聚合时mode函数报错的问题

错误原因

pandas的SeriesGroupBy对象没有内置的mode聚合方法,直接在agg里写'mode'会触发'SeriesGroupBy' object has no attribute 'mode'错误。

解决方案

需要自定义一个求众数的逻辑,或者用lambda表达式调用Series.mode()方法,同时处理众数为空/多个的情况(比如取第一个众数)。

修改后的代码示例

方法1:自定义众数函数

先定义处理众数的函数,避免空值或多众数导致的索引错误:

def get_group_mode(series):
    mode_result = series.mode()
    # 有众数返回第一个,无众数返回None
    return mode_result.iloc[0] if not mode_result.empty else None

替换原代码中agg里的'mode':

df_agg = df.sort_values(by=['userId', 'num1','num2'], ascending=False)\
           .groupby(['userId', 'cat1', 'cat2'])\
           .agg({
               'num3': 'sum', 
               'num2': 'sum',
               'num1': 'sum', 
               'num4': 'sum', 
               'num5':'sum', 
               'num6':'sum', 
               'num7': 'min', 
               'cat3': get_group_mode, 
               'cat4': get_group_mode
           })\
           .reset_index()

方法2:直接使用lambda表达式

如果不想单独定义函数,也可以用lambda直接处理:

df_agg = df.sort_values(by=['userId', 'num1','num2'], ascending=False)\
           .groupby(['userId', 'cat1', 'cat2'])\
           .agg({
               'num3': 'sum', 
               'num2': 'sum',
               'num1': 'sum', 
               'num4': 'sum', 
               'num5':'sum', 
               'num6':'sum', 
               'num7': 'min', 
               'cat3': lambda x: x.mode().iloc[0] if not x.mode().empty else None, 
               'cat4': lambda x: x.mode().iloc[0] if not x.mode().empty else None
           })\
           .reset_index()

补充说明

  • 如果分组中存在多个众数(多个值出现次数相同且最多),上述代码会返回第一个出现的众数;若要保留所有众数,可把返回值改成mode_result.tolist(),但此时聚合后的列会是列表类型,后续处理需注意。
  • 加入if not mode_result.empty else None是为了避免分组为空时触发IndexError。

内容的提问来源于stack exchange,提问作者R.A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:00:31