如何在pandas DataFrame中生成指定格式的降序数值区间列
解决方案
你原有代码仅生成了每个数值区间的左边界值,只要同步生成对应右边界,按指定格式拼接为字符串即可,不需要复杂的嵌套逻辑。
最简可运行实现
直接用列表推导配合格式化字符串生成区间列,加round处理规避0.1步长带来的浮点精度问题:
import numpy as np import pandas as pd df = pd.DataFrame({ 'Ranges': [f"{round(right - 0.1, 1)} - {round(right, 1)}" for right in np.arange(1, 0, -0.1)] })
运行后列输出为:
0 0.9 - 1.0 1 0.8 - 0.9 2 0.7 - 0.8 3 0.6 - 0.7 4 0.5 - 0.6 5 0.4 - 0.5 6 0.3 - 0.4 7 0.2 - 0.3 8 0.1 - 0.2 9 0.0 - 0.1
匹配无冗余小数的目标格式
如果需要去掉整数末尾的.0,完全匹配示例输出样式,加个简单的格式化判断即可:
def fmt_range(right_val): left = round(right_val - 0.1, 1) # 整数值转int类型,去掉冗余小数位 left = int(left) if left.is_integer() else left right_val = int(right_val) if right_val.is_integer() else right_val return f"{left} - {right_val}" df = pd.DataFrame({ 'Ranges': [fmt_range(x) for x in np.arange(1, 0, -0.1)] })
最终输出和预期完全一致:
0 0.9 - 1 1 0.8 - 0.9 2 0.7 - 0.8 3 0.6 - 0.7 4 0.5 - 0.6 5 0.4 - 0.5 6 0.3 - 0.4 7 0.2 - 0.3 8 0.1 - 0.2 9 0 - 0.1
注意事项
- 所有涉及0.1步长的浮点运算建议统一加
round(1)处理,避免出现0.9000000001、0.7999999999这类浮点存储误差导致的显示异常 - 如果需要用pandas向量化写法替代列表推导,可以直接对Series做运算拼接,性能基本一致:
right_s = pd.Series(np.arange(1, 0, -0.1)).round(1) df = pd.DataFrame({ 'Ranges': (right_s - 0.1).astype(str) + ' - ' + right_s.astype(str) })
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

