用均值填充数据集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
相关产品推荐
相关产品推荐

