Python DataFrame含异常值行删除失败,求排查与解决方法
浮点数精度导致异常值删除失败的问题分析与解决
错误原因
- 浮点数精度不匹配:你要删除的实际值是
0.52892562,但代码中使用的是0.528926。浮点数在计算机中以近似方式存储,这两个值的底层存储并不完全相等,因此精确的==或!=判断无法匹配到目标行。 - drop操作未生效:第二种方法中
OG_df.drop(i)默认不会修改原DataFrame,必须添加inplace=True参数,或者将删除后的结果重新赋值给变量,否则原数据不会发生变化。
解决方法
方法1:使用容差范围进行近似匹配
通过判断值与目标值的差值是否在极小范围内,规避浮点数精度问题:
# 筛选出差值小于1e-6的行并排除 OG_df_dropped = OG_df[~(abs(OG_df['type'] - 0.5289256) < 1e-6)] print(OG_df_dropped['type'].unique())
方法2:直接使用精确的实际值匹配
如果你明确知道异常值的精确值是0.52892562,直接用该值进行判断:
# 方法一:query筛选 OG_df_dropped = OG_df.query("type != 0.52892562") print(OG_df_dropped['type'].unique()) # 方法二:drop修改原数据 i = OG_df[OG_df['type'] == 0.52892562].index OG_df.drop(i, inplace=True) print(OG_df['type'].unique())
方法3:转换为字符串进行精确匹配
将浮点数转换为固定小数位数的字符串,彻底避免精度干扰:
# 保留6位小数转为字符串 target_str = "{:.6f}".format(0.5289256) OG_df_dropped = OG_df[OG_df['type'].apply(lambda x: "{:.6f}".format(x)) != target_str]
内容的提问来源于stack exchange,提问作者Agnes Kiss
相关产品推荐
相关产品推荐

