You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:40:58