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

pandas多级列DataFrame用groupby条件计数报TypeError如何解决?

报错原因

你遇到的报错是多个问题叠加导致的,核心原因如下:

  • 直接触发报错的问题:groupby参数使用错误。你将分组列的元组套入了列表[('grp1','cat')],pandas默认会将列表内的元素识别为行MultiIndex的多个级别进行分组,但你的行索引是普通单级索引,不符合要求,因此抛出TypeError: other must be a MultiIndex or a list of tuples。
  • 列名拼写错误:你要调用的列名是('exp0', 'rnd0'),代码中误写为('exp0', 'rdn0'),r和d顺序颠倒,会导致后续取列失败。
  • 分组统计逻辑错误:你在apply内直接调用df[('exp0', 'rdn0')],取的是全表的对应列,不是groupby拆分后的每个分组的子集,统计结果是全表总和而非分组统计结果,不符合需求。
  • 新列赋值语法错误:新增多级列时,需将两级名称包裹为元组传入方括号,你写的df['exp0_cnt','rdn0']会被pandas识别为两个独立的一级列,而非二级MultiIndex列,需改为df[('exp0_cnt', 'rnd0')]。
解决方法

根据你的需求,分两种场景给出正确代码:

场景1:统计结果回填到原表每一行(给原df加计数列)

df[('exp0_cnt', 'rnd0')] = df.groupby(('grp1', 'cat'))[('exp0', 'rnd0')].transform(lambda x: (x > 50).sum())

运行后原df会新增二级列('exp0_cnt', 'rnd0'),A组对应的行值为2,B组对应的行值为1,符合统计结果。

场景2:仅获取分组聚合的统计结果(每个分组对应一行结果)

# 写法1:用agg
group_cnt = df.groupby(('grp1', 'cat'))[('exp0', 'rnd0')].agg(lambda x: (x > 50).sum())
# 写法2:用apply
group_cnt = df.groupby(('grp1', 'cat'))[('exp0', 'rnd0')].apply(lambda x: (x > 50).sum())

两种写法输出结果一致,A组计数为2,B组计数为1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:57:03