Pandas DataFrame列大数值正则验证不生效问题求助
问题根因
校验失败是Pandas读取CSV时的自动类型推断导致的:
- 样例第8行的
11119009876541231111是20位大整数,已经超过float64类型的精度上限(2^53≈9e15),Pandas默认会将其推断为float64类型存储,出现精度损失 - 调用
apply(str)转换时,该数值会变成科学计数法格式(如1.1119009876541231e+19),和正则规则不匹配,因此被误判为非法值
解决方案
最直接的方案是读取CSV时强制按字符串类型加载所有列,完全保留原始文本内容,避免自动类型转换带来的数值变形:
import pandas as pd NumberValidationRegexnegative = r"^-?[0-9]{1,20}(?:\.[0-9]{1,3})?$" # 关键修改:添加dtype=str参数,所有列以字符串格式读取 df_CPCodeDF=pd.read_csv("D:\\FTP\LocalUser\\NCCLCOLL\\COLLATERALUPLOAD\\upld\\SplitFiles\\AACCR6675H_22102021_07_1 - Copy.csv", dtype=str) rslt_df2=df_CPCodeDF[df_CPCodeDF.iloc[:, 0].notna()] # 直接对字符串列做正则匹配即可,不需要再转str rslt_df1=rslt_df2[~rslt_df2.iloc[:,0].str.contains(NumberValidationRegexnegative, regex=True)].index print("rslt_df1",rslt_df1)
修改后运行即可得到预期的空索引输出。
补充说明
如果后续需要用到数值计算,可以在校验通过后再单独对指定列做类型转换,避免提前转换引入精度问题。
内容的提问来源于stack exchange,提问作者Alok Sharma
相关产品推荐
相关产品推荐

