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

如何用Pandas一步对不同列执行groupby分组计数?

问题描述

现有如下DataFrame,其中feature1、feature2、feature3为独立特征,取值仅为1、2、3、4。需按每个特征的取值结合State分组统计数量,目前只能逐列单独处理,希望找到一步完成或更优的实现方式。

当前实现代码:

import pandas as pd
df = pd.DataFrame({'State'    : ['AZ', 'FL', 'AZ', 'FL', 'FL', 'FL', 'AZ', 'FL', 'AZ', 'AZ', 'FL', 'AZ', 'FL', 'AZ', 'AZ'],
               'feature1' : [1, 3, 2, 2, 4, 3, 3, 1, 2, 4, 3, 1, 1, 1, 1],
               'feature2' : [1, 2, 1, 2, 3, 2, 4, 1, 2, 4, 3, 1, 1, 1, 1],
               'feature3' : [1, 4, 1, 2, 1, 4, 3, 3, 2, 4, 3, 1, 1, 1, 1],})
(
    df
    .groupby(['State', 'feature1'])
    ['feature1']
    .size()
    .to_frame('N')
 )

feature1的输出结果:

Statefeature1N
AZ15
AZ22
AZ31
AZ42
FL13
FL21
FL33
FL41

优化实现方案

可通过数据重塑+一次分组统计实现批量处理,无需逐列重复编码,具体步骤如下:

  1. 用melt将宽表转为长格式,把所有特征列统一映射为「特征名称-特征值」的结构,保留State作为分组标识;
  2. 按State、特征名称、特征值三级分组,统计每组的样本数量;
  3. 可选:通过索引筛选快速获取单个特征的统计结果。

完整代码:

import pandas as pd

df = pd.DataFrame({'State'    : ['AZ', 'FL', 'AZ', 'FL', 'FL', 'FL', 'AZ', 'FL', 'AZ', 'AZ', 'FL', 'AZ', 'FL', 'AZ', 'AZ'],
                   'feature1' : [1, 3, 2, 2, 4, 3, 3, 1, 2, 4, 3, 1, 1, 1, 1],
                   'feature2' : [1, 2, 1, 2, 3, 2, 4, 1, 2, 4, 3, 1, 1, 1, 1],
                   'feature3' : [1, 4, 1, 2, 1, 4, 3, 3, 2, 4, 3, 1, 1, 1, 1],})

# 转长格式并批量统计
result = (
    df.melt(id_vars='State', var_name='feature', value_name='value')
      .groupby(['State', 'feature', 'value'])
      .size()
      .to_frame('N')
)

# 查看结果
print(result)

输出示例

N
State feature  value
AZ    feature1 1     5
               2     2
               3     1
               4     2
      feature2 1     5
               2     1
               4     2
      feature3 1     5
               2     1
               3     1
               4     1
FL    feature1 1     3
               2     1
               3     3
               4     1
      feature2 1     2
               2     3
               3     2
      feature3 1     2
               2     1
               3     2
               4     2

补充说明

  • 若需单独查看某一特征的结果,可通过索引筛选实现,例如获取feature1的统计结果:
    result.xs('feature1', level='feature')
    
    输出将与原代码的结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:47:06