Pandas列应用正则清洗返回NaN,转列表后正常的问题排查
问题原因分析
这种异常通常由以下几个核心原因导致:
原始列的混合数据类型
pandas读取文件时,若X/Y列被识别为object类型但实际存储了混合数据(比如同时包含字符串、整数、浮点数或numpy原生NaN),正则表达式仅能对字符串类型生效,非字符串元素会直接返回NaN。而将DataFrame转成列表重构时,所有元素会被强制转换为字符串类型,正则匹配就能正常执行。隐藏格式/编码问题
原始数据中可能存在不可见控制字符、全角空格或编码异常(比如文件编码与pandas读取时指定的编码不匹配),这些字符会导致正则表达式无法匹配目标内容。转成列表重构的过程中,pandas会自动标准化字符串格式,过滤或转换这些隐藏异常字符,使得正则规则能够正确匹配。pandas的元素存储机制差异
原始DataFrame的object列可能直接引用了非字符串对象(比如数值类型的标量),apply遍历这些元素时,正则函数因类型不兼容返回NaN。而列表转换会将所有元素序列化为字符串形式,消除了类型不兼容的问题。
举个简单场景:
原始DataFrame的X列包含123(整数类型)和"abc123"(字符串类型),执行df['X'].apply(lambda x: re.findall(r'\d+', x))时,整数123会触发类型错误,最终返回NaN;但转成列表df['X'].tolist()后,123会变成字符串"123",此时正则就能正常提取出["123"]。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

