如何在Python/Pandas中保留两位小数且不进行四舍五入?
Pandas Series保留两位小数且不四舍五入的实现方案
针对你需要处理的float64类型经纬度Series,要保留两位小数且不四舍五入,这里提供几种靠谱的实现方法:
方法1:结合numpy的sign和floor处理(推荐)
因为涉及负数,直接用floor会导致数值被"向下取整"(比如-74.002会被floor成-74.01),所以需要先取绝对值处理,再恢复符号:
import pandas as pd import numpy as np series = pd.Series([-74.002568, -74.003085, -74.003546]) # 缩放100倍后取绝对值的floor,再恢复符号并缩放回原比例 truncated_series = np.sign(series) * np.floor(np.abs(series) * 100) / 100 # 可选:强制显示两位小数(避免因浮点精度问题显示成-74.0) truncated_series = truncated_series.round(2) print(truncated_series)
输出结果:
0 -74.00 1 -74.00 2 -74.00 dtype: float64
方法2:使用math.trunc结合apply
利用math.trunc直接截断整数部分的特性,先把数值放大100倍截断,再缩小回原比例:
import pandas as pd import math series = pd.Series([-74.002568, -74.003085, -74.003546]) truncated_series = series.apply(lambda x: math.trunc(x * 100) / 100) # 强制显示两位小数 truncated_series = truncated_series.map("{:.2f}".format).astype(float) print(truncated_series)
方法3:自定义截断函数
如果需要更清晰的逻辑,可以写一个自定义函数处理每个元素:
import pandas as pd def truncate_two_decimals(x): # 处理符号 sign = 1 if x >= 0 else -1 # 放大100倍后取整截断,再缩小回原比例 truncated_val = int(abs(x) * 100) / 100 return sign * truncated_val series = pd.Series([-74.002568, -74.003085, -74.003546]) truncated_series = series.apply(truncate_two_decimals) # 确保显示两位小数 truncated_series = truncated_series.round(2) print(truncated_series)
为什么你之前的方法没生效?
round():默认会执行四舍五入,不符合"不进位"的要求;trunc():默认是截断所有小数位,无法指定保留两位;- for循环没修改数据:大概率是遍历Series时修改的是元素副本,没有将结果赋值回原Series或者新变量。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

