为何Pandas中Series.std()对相同数值的计算结果不一致?
这不是Pandas的Bug,是浮点数精度问题
核心原因
0.19这个十进制小数无法被二进制浮点数精确存储,实际在内存中是一个接近0.19的近似值。当计算样本标准差(Pandas的std()默认使用ddof=1,即除以n-1)时:
- 2个元素:两个近似值的差异极小,计算后结果被舍入为0;
- 3个元素:浮点数的累积误差在计算过程中未被完全抵消,导致出现一个极小的非零值(本质是浮点数噪声);
- 4个元素:误差再次被抵消或舍入,结果回到0。
验证方法
如果使用精确小数类型存储数值,就能得到理论上的0:
import pandas as pd from decimal import Decimal s = pd.Series([Decimal('0.19')] * 3) print(s.std()) # 输出0
补充说明
样本标准差的计算公式为:$\sqrt{\frac{\sum_{i=1}^n (x_i - \bar{x})2}{n-1}}$。当所有$x_i$理论相等时,分子应为0,但浮点数的近似存储导致$\sum_{i=1}n (x_i - \bar{x})^2$是一个极小的正数,最终开根得到非零结果。
内容的提问来源于stack exchange,提问作者Václav Bočan
相关产品推荐
相关产品推荐

