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

Pandas按a、b两列分组统计d列不同值出现次数的实现问题

错误原因

你写的代码逻辑完全不匹配需求,问题出在两点:

  • df.groupby('a')['b'].value_counts()返回的是以(a, b)为多级索引、值为每组计数结果的Series,它既不是对应原DataFrame行的布尔掩码,也不是合法的行号/行标签,不能直接用来索引df['d']
  • 你没有把d列纳入分组统计的逻辑,自然得不到d列不同取值的计数结果
实现方案

方法1:直接分组统计(输出多级索引长表)

直接将a、b作为分组键,对d列做值统计即可,代码如下:

print(df.groupby(['a', 'b'])['d'].value_counts())

输出结果示例:

a     b  d
john  1  1    2
      2  0    1
         1    1
      3  0    1
mary  1  0    1
      2  0    1
Name: count, dtype: int64

可以直接看到每个(a, b)分组下d取0、1的次数,和你要求的场景完全匹配:比如a=john、b=1时d=1共出现2次,a=john、b=3时d=0共出现1次。

方法2:转宽表更易读

如果希望0、1作为单独列展示,没有出现的取值默认计数为0,可以加unstack处理:

print(df.groupby(['a', 'b'])['d'].value_counts().unstack(fill_value=0))

输出结果示例:

d       0  1
a    b      
john 1  0  2
     2  1  1
     3  1  0
mary 1  1  0
     2  1  0

方法3:用交叉表直接生成宽表

也可以用pd.crosstab一步得到宽表结果:

print(pd.crosstab(index=[df['a'], df['b']], columns=df['d']))

输出结果和方法2完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:36:05