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

用均值填充数据集NaN值时触发TypeError错误的排查求助

解决填充NaN时的TypeError问题

首先,咱们先把问题拆解清楚:你遇到的TypeError: must be str, not int,大概率是因为你通过索引获取列名的过程中出现了类型匹配问题——虽然df.columns.get_loc(c)能拿到列的整数索引,但绕一圈再用df[df.columns[i]]调用列,不如直接遍历列名来得直接,也更容易避免类型错误。

另外,你提到待填充列包含object类型,这里要注意:object类型的列(比如字符串列)是无法计算均值的,直接调用mean()只会返回NaN,根本起不到填充作用,这也是你代码里的一个潜在隐患。

给你重构后的代码,既解决类型错误,又区分了数值型和object型列的填充逻辑:

def fill_mean():
    # 直接遍历需要填充的列名,避免索引转换的麻烦
    for col in missing:
        # 只对数值型列(float64/int64)用均值填充
        if df[col].dtype in ('float64', 'int64'):
            df[col] = df[col].fillna(df[col].mean())
        # 对object类型列,建议用众数填充(因为没有均值可言)
        elif df[col].dtype == 'object':
            # mode()返回的是Series,取第一个元素就是最频繁的值
            df[col] = df[col].fillna(df[col].mode()[0])
    return df

为什么原来的代码会报错?

你的原代码里,m = [df.columns.get_loc(c) for c in df.columns if c in missing]生成的是列的整数索引列表,然后循环i(整数),用df[df.columns[i]]获取列。理论上这没问题,但如果你的DataFrame列名本身是整数类型(比如列名是0、1、2...),或者missing列表里混入了非字符串元素,就会触发must be str, not int的错误——因为Python会把你传入的整数当成行索引去查找,而不是列名。

直接遍历列名的方式就完全避开了这个问题,逻辑也更清晰。

内容的提问来源于stack exchange,提问作者plastico

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:04:26