如何以兼容未来版本的方式将Pandas DataFrame转换为数值类型?
如何以兼容未来版本的方式将Pandas DataFrame转换为数值类型?
我太懂这种升级工具后突然收到警告的烦躁了!之前你用map搭配pd.to_numeric(errors='ignore')的方法确实简洁,但Pandas 2.2.3开始不推荐在map里传递errors参数了。不过咱们完全可以用更优雅的矢量化方式替代,根本不用挨个遍历单元格!
首选方案:用apply按列处理
最直接的替代方法是把map换成apply,让pd.to_numeric按列处理数据——这更贴合Pandas的设计逻辑,而且不会触发未来警告:
import pandas as pd A = pd.DataFrame({ 'x' : ['1','2','3'], 'y' : ['not_a_number','5',9999], }) B = A.apply(pd.to_numeric, errors='ignore')
这个方法的效果和你原来的代码完全一致:能转换成数值的条目会自动转成数值类型,无法转换的(比如'not_a_number')会保留原内容。而且apply是矢量化操作,效率比遍历单元格高得多。
更稳妥的兜底方案:自定义转换函数
如果担心未来pd.to_numeric的errors='ignore'参数也会被调整,咱们可以自己写一个带错误捕获的转换函数,再用applymap应用到每个元素上:
def safe_convert_to_numeric(val): try: # 尝试转换为数值 return pd.to_numeric(val) except (ValueError, TypeError): # 转换失败就返回原内容 return val B = A.applymap(safe_convert_to_numeric)
这个方法完全自定义逻辑,不受Pandas版本更新的影响,唯一的小缺点是applymap是按元素处理的,对于超大型数据集,效率会比按列处理的apply稍低一点,但日常使用完全足够。
你可以试试这两种方法,都能完美替代原来的逻辑,而且完全兼容未来的Pandas版本~
备注:内容来源于stack exchange,提问作者Jos
相关产品推荐
相关产品推荐

