Pandas执行去重操作后仍存在重复float值的问题排查
Pandas浮点数列去重后仍有重复值的解决办法
核心问题出在浮点数的精度误差:大部分十进制小数无法被二进制浮点数精确表示,比如0.1在二进制中是无限循环的,存储时会被截断,导致看起来完全相同的数值,实际底层存储的精确值存在细微差异——而Pandas的drop_duplicates()是严格按精确值判断是否重复的。
验证精度差异
先确认是不是精度问题:把列值转换成高精度字符串,查看真实存储值:
df['your_float_col'].apply(lambda x: format(x, '.20f'))
如果输出的字符串末尾有不同的数字,那就实锤是精度误差导致的。
解决方法
四舍五入到指定小数位
这是最常用的方法,根据你的业务需求把数值统一到固定小数位,再去重:# 保留6位小数,可根据实际调整 df['your_float_col'] = df['your_float_col'].round(6) df = df.drop_duplicates(subset=['your_float_col'])用近似相等判断去重
如果不想丢失精度,用numpy.isclose()来判断数值是否近似相等,手动筛选唯一行:import numpy as np keep_indices = [0] for idx in range(1, len(df)): current_val = df['your_float_col'].iloc[idx] # 和已保留的所有值对比,都不近似相等才保留 if not any(np.isclose(current_val, df['your_float_col'].iloc[keep_indices])): keep_indices.append(idx) df_unique = df.iloc[keep_indices]用Decimal类型处理精确小数
导入decimal模块,把浮点数列转换成精确的Decimal类型后再去重:from decimal import Decimal df['your_float_col'] = df['your_float_col'].apply(Decimal) df = df.drop_duplicates(subset=['your_float_col'])
额外提醒
如果这些浮点数是从CSV/Excel等文件读取的,检查读取时是否有格式解析问题;如果是字符串转换来的,确认原始字符串没有隐藏字符或格式错误。
内容的提问来源于stack exchange,提问作者Mateusz Szymczak
相关产品推荐
相关产品推荐

