Python:去除DataFrame中重复小数点的实现方法
处理DataFrame中含多个小数点的数值数据清洗问题
我有一个存储手动输入数据的DataFrame,其中数据应为数值类型,但存在多处数据质量问题——部分值包含多个小数点(示例如下)。小数据集可手动修正,但大数据集操作过于繁琐,需去除多余小数点以得到指定格式结果。此前尝试的字符长度截取法因小数点位置不固定而失效。
原始数据
A B 0 54.6464 46.8484 1 64.68461 65.4 2 95.79527 65.644 3 484.644.161 45.45 4 71.257.9 21.1 5 12.8 10.8 6 9.6 12.5 7 312.4 12.787.57.674
期望结果
A B 0 54.646400 46.848400 1 64.684610 65.400000 2 95.795270 65.644000 3 484.644161 45.450000 4 71.257900 21.100000 5 12.800000 10.800000 6 9.600000 12.500000 7 312.400000 12.787577
失效的尝试代码
df['A'] = df['A'].str.slice(0,4) df['B'] = df['B'].str.slice(0,4)
解决方案
核心思路是保留第一个小数点,删除后续所有小数点,再转换为数值类型并统一格式化小数位数,用正则或字符串处理即可实现批量清洗:
方法1:用正则表达式快速替换
直接通过str.replace配合正则,匹配第一个小数点后的所有小数点并删除:
import pandas as pd # 处理每一列 df['A'] = df['A'].astype(str).replace(r'(?<=\.)\.', '', regex=True).astype(float).round(6) df['B'] = df['B'].astype(str).replace(r'(?<=\.)\.', '', regex=True).astype(float).round(6)
方法2:自定义函数处理(更直观)
如果觉得正则不好理解,也可以写一个简单的函数实现逻辑:
def clean_multi_dot(val): s = str(val) first_dot_pos = s.find('.') if first_dot_pos == -1: return s # 保留第一个小数点,后面的小数点全部去掉 return s[:first_dot_pos+1] + s[first_dot_pos+1:].replace('.', '') # 应用到列上并格式化 df['A'] = df['A'].apply(clean_multi_dot).astype(float).round(6) df['B'] = df['B'].apply(clean_multi_dot).astype(float).round(6)
逻辑说明
- 先将所有值转为字符串,确保能处理非字符串类型的输入;
- 通过正则或字符串截取保留第一个小数点,删除后续所有多余小数点,保证数值格式合法;
- 转换为
float类型后用round(6)统一保留6位小数,与期望结果格式对齐; - 两种方法都能适配任意位置的小数点,完全解决固定长度截取的局限性,可高效处理大数据集。
内容的提问来源于stack exchange,提问作者ledzed
相关产品推荐
相关产品推荐

