pandas混合类型列中存储为文本的数字转换为数值的更优方法
优化方案
你原有的实现逻辑完全通顺,最大的可优化点是不需要用apply包装pd.to_numeric,这个函数原生支持直接传入Series对象,直接调用即可获得更好的性能,尤其数据规模扩大后优势会更明显。
优化后代码如下:
raw["Matl Group"] = ( pd.to_numeric(raw["Matl Group"], errors="coerce") .fillna(raw["Matl Group"]) )
性能对比参考
- 20万行级别测试下,优化后的向量化写法比原
apply写法快5~10倍 - 百万行级别下性能差距会拉到20倍以上,完全能支撑后续数据规模增长的需求
补充说明
- 转换完成后该列的dtype为
object是正常现象,因为列内同时存在数值和字符串两种类型,pandas的数值类型列无法混存非数值内容,该状态不影响pd.merge()的匹配逻辑 - 若需要校验转换效果,可运行如下代码统计各类型的占比,排查异常数据:
# 统计列内各数据类型的数量 raw["Matl Group"].apply(type).value_counts()
- 若存在物料组字母大小写不一致的情况(比如同时存在
8120m和8120M),可在转换前加一步统一大小写,避免匹配失败:
# 先统一为大写再做转换 raw["Matl Group"] = ( pd.to_numeric(raw["Matl Group"].str.upper(), errors="coerce") .fillna(raw["Matl Group"].str.upper()) )
内容的提问来源于stack exchange,提问作者Asrakh
相关产品推荐
相关产品推荐

