无法将Pandas DataFrame的job列转为int64类型的技术问题
问题根源
你遇到的报错和job列变成float类型的核心问题,是自定义的map_job_values函数对不在映射字典里的元素没返回值,导致生成了NaN。
Pandas里普通的整数类型存不了NaN,所以会自动把列转成float;当你强行转int64时,因为存在NaN就触发了IntCastingNaNError。哪怕你删了空值也没用,因为这些NaN是未匹配的职业值生成的,不是显式的空值(比如None),普通的空值清理方法扫不到它们。
解决方案
方案1:修复映射函数,保证所有输入都有输出
把map_job_values里多余的if判断删掉,直接用get方法返回默认值,这样不管输入啥都有对应结果,不会生成NaN:
class PreprocessJobColumn(BaseEstimator, TransformerMixin): def __init__(self): self.dictionary_map = { "admin": 1, "blue-collar": 2, "entrepreneur": 3, "housemaid": 4, "management": 5, "retired": 6, "self-employed": 7, "services": 8, "student": 9, "technician": 10, "unemployed": 11 } def map_job_values(self, element_to_process): # 未匹配到的直接返回-1,不会产生NaN return self.dictionary_map.get(element_to_process, -1) def fit_transform(self, X): features_dataset_copy = X.copy() features_dataset_copy["job"] = features_dataset_copy["job"].apply(self.map_job_values) # 现在没有NaN,放心转int64 features_dataset_copy["job"] = features_dataset_copy["job"].astype("int64") return features_dataset_copy
方案2:用Pandas的replace替代apply(更高效)
apply处理大数据集效率低,直接用replace更简洁,还能指定未匹配值的填充:
class PreprocessJobColumn(BaseEstimator, TransformerMixin): def __init__(self): self.dictionary_map = { "admin": 1, "blue-collar": 2, "entrepreneur": 3, "housemaid": 4, "management": 5, "retired": 6, "self-employed": 7, "services": 8, "student": 9, "technician": 10, "unemployed": 11 } def fit_transform(self, X): features_dataset_copy = X.copy() # replace自动映射,未匹配的用-1填充,避免NaN features_dataset_copy["job"] = features_dataset_copy["job"].replace(self.dictionary_map, fill_value=-1) features_dataset_copy["job"] = features_dataset_copy["job"].astype("int64") return features_dataset_copy
额外排查:找出未知职业值
如果不想用-1当默认值,可以先找出所有不在字典里的职业,再决定是补充映射还是删行:
# 找出job列里不在映射字典的所有值 preprocess_job = PreprocessJobColumn() unknown_jobs = df_copy[~df_copy["job"].isin(preprocess_job.dictionary_map.keys())]["job"].unique() print("未知职业:", unknown_jobs) # 要是想删掉这些行 df_copy = df_copy[df_copy["job"].isin(preprocess_job.dictionary_map.keys())]
补充提示
- Pandas 1.0+支持
Int64(大写I)类型,能存NaN,如果需要保留缺失值又想用整数类型,可以转成astype("Int64"),但有些机器学习模型对可空整数支持有限,优先处理NaN更稳妥。 - 分类特征编码也可以用sklearn的
OrdinalEncoder,不用手动写映射字典,自动处理所有类别,更适合标准化的机器学习流程。
内容的提问来源于stack exchange,提问作者coffee_programmer
相关产品推荐
相关产品推荐

