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

