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

Pandas中groupby后用transform调用mode报错,如何解决?

问题:Pandas分组Transform计算众数报错解决

问题背景

给定如下数据集:

import pandas as pd
thedf = pd.DataFrame({'id':['A','A','A','A','A','A','A','A',
                            'B','B','B','B','B','B','B','B'],
                      'group':['X','X','X','X','Y','Y','Y','Y',
                               'X','X','X','X','Y','Y','Y','Y'],
                     'value':['Ball','Coin','Coin','Coin','Yoyo','Yoyo','Toy','Puzzle',
                              'Ham','Grape','Ham','Ham','Pear','Pear','Pear','Ham']})

数据集预览:

idgroupvalue
0AXBall
1AXCoin
2AXCoin
3AXCoin
4AYYoyo
5AYYoyo
6AYToy
7AYPuzzle
8BXHam
9BXGrape
10BXHam
11BXHam
12BYPear
13BYPear
14BYPear
15BYHam

需要按id和group两级分组,用transform计算每组value列的众数,添加为mode列,期望结果:

idgroupvaluemode
0AXBallCoin
1AXCoinCoin
2AXCoinCoin
3AXCoinCoin
4AYYoyoYoyo
5AYYoyoYoyo
6AYToyYoyo
7AYPuzzleYoyo
8BXHamHam
9BXGrapeHam
10BXHamHam
11BXHamHam
12BYPearPear
13BYPearPear
14BYPearPear
15BYHamPear

尝试执行以下代码时报错:

thedf['mode'] = thedf.groupby(['id','group'])['value'].transform('mode')

错误信息:

ValueError: 'mode' is not a valid function name for transform(name)

原因分析

Pandas的transform方法支持的内置函数名称有限,mode不在内置列表中,因此直接传入字符串'mode'会触发报错,需要通过自定义逻辑来实现众数计算。

解决方法

方法1:自定义众数函数

编写函数返回分组的众数(若存在多个众数,取第一个):

def get_group_mode(series):
    return series.mode().iloc[0]

thedf['mode'] = thedf.groupby(['id','group'])['value'].transform(get_group_mode)

方法2:使用匿名函数简化

直接在transform中调用mode方法并提取结果:

thedf['mode'] = thedf.groupby(['id','group'])['value'].transform(lambda x: x.mode().iloc[0])

方法3:借助Scipy工具(需安装Scipy)

如果已安装scipy,可以用其mode函数直接获取众数:

from scipy.stats import mode

thedf['mode'] = thedf.groupby(['id','group'])['value'].transform(lambda x: mode(x, keepdims=False)[0])

以上三种方法均可生成符合预期的mode列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:10:29