将DataFrame列转为NumPy数组时丢失小数位但保留小数点的问题
解决DataFrame转NumPy数组丢失小数末尾0的问题
这个问题本质是浮点数的显示特性——浮点数在内存中以二进制形式存储,不会保留末尾的0格式,只是打印或显示时会自动省略,并非数据真的丢失了精度。下面给你几种实用的解决思路:
先确认数据本身无异常
你可以先验证转换前后的数值是否完全一致:
import numpy as np original_vals = data.iloc[:, size_df].values converted_arr = data.iloc[:, size_df].astype(float).to_numpy() # 对比数值是否相等,结果应为True print(np.array_equal(original_vals.astype(float), converted_arr))
比如原DataFrame里的1.70,转成float后存储的是1.7,但二者数值完全相等,仅显示格式不同。
若需显示时保留末尾的0
方法1:设置NumPy打印选项强制固定小数位
修改NumPy的全局打印规则,让输出时显示指定位数的小数:
np.set_printoptions(precision=2, suppress=True) # 保留2位小数,关闭科学计数法 arr = data.iloc[:, size_df].astype(float).to_numpy() print(arr) # 此时会输出类似[1.70, 1.80, 1.65]的格式
方法2:转成字符串类型保留原格式
如果需要严格保留原数据的文本格式,直接将列转成字符串再转数组:
# 直接转换为字符串数组 arr_str = data.iloc[:, size_df].astype(str).to_numpy() # 若原列为数值类型,可手动格式化指定小数位 arr_formatted = np.array([f"{val:.2f}" for val in data.iloc[:, size_df]])
方法3:用结构化数组兼顾数值类型与显示格式
如果需要同时保留数值类型和可控的显示格式,可使用结构化数组:
# 创建结构化数组,指定字段类型为float64 structured_arr = data.iloc[:, size_df].to_numpy(dtype=[('height', 'f8')]) # 打印时格式化输出 for item in structured_arr: print(f"{item['height']:.2f}")
内容的提问来源于stack exchange,提问作者dani_l_n
相关产品推荐
相关产品推荐

