Pandas提取object类型区间列值至两int列:效率与类型转换问题
问题解答
1. 当前实现是不是最高效的?
不是。当前代码用map+lambda逐行处理,属于Python层面的循环操作,效率较低,尤其是数据量较大时。更高效的方式是利用Pandas的矢量化字符串操作(比如str.split),它底层基于C实现,无需逐行遍历,且只需拆分一次就能同时获取最小值和最大值的原始内容,避免了两次遍历原列的开销。
2. 如何将生成的string类型列转为int类型?
因为原列存在NaN值,直接用astype(int)会报错(NaN无法转换为普通int),推荐以下两种方式:
方式一:拆分时直接转换(推荐)
先通过str.split拆分列,再用pd.to_numeric转换为数值型,最后转为支持缺失值的可空整数类型Int64:
import pandas as pd # 拆分列,得到两列原始字符串 split_result = df["values"].str.split(" - ", expand=True) # 转换为可空整数类型,errors="coerce"将无效值转为pd.NA df["min"] = pd.to_numeric(split_result[0], errors="coerce").astype("Int64") df["max"] = pd.to_numeric(split_result[1], errors="coerce").astype("Int64")
方式二:修改原有代码转换
如果要基于你原来的代码调整,可以在赋值时直接转换,同时用pd.NA适配缺失值场景:
import numpy as np import pandas as pd df["min"] = df["values"].map(lambda x: int(minimum) if x and (minimum:=str(x).split(" - ")[0]) else pd.NA).astype("Int64") df["max"] = df["values"].map(lambda x: int(maximum) if x and " - " in str(x) and (maximum:=str(x).split(" - ")[1]) else pd.NA).astype("Int64")
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

