为何Python round函数在pandas DataFrame与普通列表中返回值类型有差异?
问题解答
为什么pandas的apply(round)返回浮点型数值?
当你在pandas DataFrame上调用apply(round)时,本质上是对每一列(默认按列处理)的每个元素执行round函数,但pandas会严格保持列的数据类型一致性。
你的原始DataFrame a的列类型是float64(因为初始化时用的是浮点数),哪怕round函数把数值变成了整数形式,pandas也不会自动将列的类型转换为int——这是为了避免出现类型混乱:如果后续有一个元素无法被舍入为整数(比如某个值是1.3,舍入后是1.0但仍为浮点型),整列的类型可以统一保持为浮点型,不会出现混合类型的列(pandas对混合类型的处理效率极低,还容易引发意外问题)。
如果想把结果转换成整数类型,可以显式调用astype(int):
import pandas as pd a = pd.DataFrame([[1.2,3.4],[1.4,4.6]]) a = a.apply(round).astype(int)
这样输出的就是整数类型的DataFrame了。
为什么round(0.5)和list(map(round, x))的行为看起来有差异?
其实这不是差异,而是Python的round函数遵循银行家舍入法(四舍六入五成双)的规则:当需要舍入的数字小数部分恰好是0.5时,会舍入到最近的偶数,而非我们直觉里的“四舍五入”。
咱们拆解你的例子:
round(0.5):0和1都是距离0.5最近的整数,这时候会选偶数0,所以结果是0。round(2.5):2和3是最近的整数,选偶数2,所以在你的列表[1.4,2.5,3.6]中,2.5被舍入为2。round(3.6):小数部分0.6大于0.5,直接舍入到4,符合预期。
这种舍入方式在统计场景中更公平,能避免长期舍入导致的系统性偏差,是很多编程语言的默认舍入规则。
内容的提问来源于stack exchange,提问作者paradocslover
相关产品推荐
相关产品推荐

