如何用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的输出结果:
| State | feature1 | N |
|---|---|---|
| AZ | 1 | 5 |
| AZ | 2 | 2 |
| AZ | 3 | 1 |
| AZ | 4 | 2 |
| FL | 1 | 3 |
| FL | 2 | 1 |
| FL | 3 | 3 |
| FL | 4 | 1 |
优化实现方案
可通过数据重塑+一次分组统计实现批量处理,无需逐列重复编码,具体步骤如下:
- 用
melt将宽表转为长格式,把所有特征列统一映射为「特征名称-特征值」的结构,保留State作为分组标识; - 按
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],}) # 转长格式并批量统计 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
相关产品推荐
相关产品推荐

