Python多列分组:Categorical类型与数值类型结果差异原因
问题解答
差异原因
当Series列是数值类型时,groupby只会基于数据中实际存在的(Series, Name)组合进行分组计数,因此只返回有对应数据的行,不会出现计数为0的情况。
而当Series列是Categorical(分类)类型时,分类类型的核心特性是拥有预定义的类别集合(哪怕部分类别在数据中没有实际出现)。pandas对分类列分组时,默认会遍历该列的所有类别,再和Name列的所有唯一值生成笛卡尔积组合,对每个组合计数——不存在的组合自然会得到0值,同时结果会按分类类别和姓名的字母顺序排序。
解决方法
如果希望分类列分组时和数值列行为一致,只返回实际存在的组合,可以在groupby中添加observed=True参数:
df.groupby(['Series','Name'], observed=True)['Name'].count()
执行后就会和数值类型分组的结果完全一致,不会出现计数为0的行。
原始数据表格
| 季数 | 姓名 |
|---|---|
| 1 | David |
| 1 | Edward |
| 1 | Jasmine |
| 2 | Lea |
| 2 | Jonathan |
| 2 | Louise |
数值类型分组结果
| 季数 | 姓名 | 计数 |
|---|---|---|
| 1 | David | 1 |
| 1 | Edward | 1 |
| 1 | Jasmine | 1 |
| 2 | Lea | 1 |
| 2 | Jonathan | 1 |
| 2 | Louise | 1 |
分类类型默认分组结果
| 季数 | 姓名 | 计数 |
|---|---|---|
| 1 | David | 1 |
| 2 | David | 0 |
| 1 | Edward | 1 |
| 2 | Edward | 0 |
| 1 | Jasmine | 1 |
| 2 | Jasmine | 0 |
| 1 | Jonathan | 0 |
| 2 | Jonathan | 1 |
| 1 | Lea | 0 |
| 2 | Lea | 1 |
| 1 | Louise | 0 |
| 2 | Louise | 1 |
内容的提问来源于stack exchange,提问作者Lordchimichanga
相关产品推荐
相关产品推荐

