DataFrame中value_counts(normalize=True)的归一化原理解析
关于pandas中
value_counts(normalize=True)的归一化逻辑解释 场景与测试结果
基于泰坦尼克号数据集,对Fsize(家庭规模)分组后,统计Survived(是否存活)的数量与占比:
1. 非归一化统计(normalize=False)
执行代码:
dftitanic.groupby('Fsize')['Survived'].value_counts(normalize=False).reset_index(name='perc')
结果:
Fsize Survived perc 0 1 0 374 1 1 1 163 2 2 1 89 3 2 0 72 4 3 1 59 5 3 0 43 6 4 1 21 7 4 0 8 8 5 0 12 9 5 1 3 10 6 0 19 11 6 1 3 12 7 0 8 13 7 1 4 14 8 0 6 15 11 0 7
2. 归一化统计(normalize=True)
执行代码:
dftitanic.groupby('Fsize')['Survived'].value_counts(normalize=True).reset_index(name='perc')
结果:
Fsize Survived perc 0 1 0 0.696462 1 1 1 0.303538 2 2 1 0.552795 3 2 0 0.447205 4 3 1 0.578431 5 3 0 0.421569 6 4 1 0.724138 7 4 0 0.275862 8 5 0 0.800000 9 5 1 0.200000 10 6 0 0.863636 11 6 1 0.136364 12 7 0 0.666667 13 7 1 0.333333 14 8 0 1.000000 15 11 0 1.000000
核心逻辑解释
value_counts(normalize=True)的本质是在每个分组内,计算单个类别样本数占该分组总样本数的比例,而非全局的数值归一化(比如你尝试的Z-score或Min-Max归一化)。
用具体分组验证:
- 对于
Fsize=1的分组:总样本数=374+163=537- Survived=0的占比=374/537≈0.696462
- Survived=1的占比=163/537≈0.303538
- 对于
Fsize=2的分组:总样本数=89+72=161- Survived=1的占比=89/161≈0.552795
- Survived=0的占比=72/161≈0.447205
这些计算结果完全匹配normalize=True的输出。
你之前尝试的两种方法(Z-score、Min-Max)是对整个数据集的数值列做全局缩放,和value_counts(normalize=True)的分组内类别占比逻辑完全不同,因此结果无法匹配。
内容的提问来源于stack exchange,提问作者Farrukh Waheed
相关产品推荐
相关产品推荐

