在Pandas/Numpy中实现距离值向最近binsize倍数取整的简便方法
问题描述
我有一个包含float64类型距离值的DataFrame,示例代码如下:
import numpy as np import pandas as pd binsize = 0.05 df = pd.DataFrame() df['distance'] = [0.01555, 0.6, 0.99, 1.24]
输出结果为:
distance 0 0.01555 1 0.60000 2 0.99000 3 1.24000
我希望将该列的最小值和最大值取整到最接近的binsize倍数,目前的实现方式是:
np.round(np.round(df['distance'].min() / binsize) * binsize, 2) np.round(np.round(df['distance'].max() / binsize) * binsize, 2)
此方法会得到0.0和1.25的结果,请问是否有更简便的实现方式?
简化实现方案
以下几种方式可以达到相同效果,且代码更简洁:
方式1:合并round操作
不需要嵌套两层np.round(),先完成倍数取整,再统一处理小数位数即可:
min_val = np.round(df['distance'].min() / binsize) * binsize max_val = np.round(df['distance'].max() / binsize) * binsize # 处理浮点数精度,保留两位小数 min_val = np.round(min_val, 2) max_val = np.round(max_val, 2)
运行后同样得到0.0和1.25的结果。
方式2:使用pandas内置round方法
利用DataFrame列的round()方法,逻辑和方式1一致,更贴合pandas使用场景:
min_val = (df['distance'].min() / binsize).round() * binsize max_val = (df['distance'].max() / binsize).round() * binsize min_val = min_val.round(2) max_val = max_val.round(2)
补充说明
如果遇到浮点数精度异常(比如出现0.05000000000000001这类结果),可以直接用np.around()或者字符串格式化修正,但上述方法已经能覆盖大部分常规场景。
内容的提问来源于stack exchange,提问作者Sheldon
相关产品推荐
相关产品推荐

