如何用中位数替换数据集中的'?'?代码失效问题求助
问题分析与解决
你的代码有两个核心错误导致替换无效:
双重循环逻辑错误
你用两层循环让每个列遍历所有中位数进行替换,这完全不符合需求——每个列只需要对应medias列表里同位置的那个中位数,不需要遍历所有中位数。pandas的replace方法默认不修改原数据
dataset_1[col].replace('?', media)只会生成一个替换后的新Series对象,但不会自动修改原数据集。你要么添加inplace=True参数直接修改原数据,要么把替换后的结果赋值回原列。
修正后的代码
medias = [] # 计算各列排除'?'后的中位数 for col in dataset_1: # 过滤'?'并转为数值类型,避免object类型导致中位数计算异常 filtered_values = dataset_1[col][dataset_1[col] != '?'].astype(float) medias.append(filtered_values.median()) # 替换各列的'?'为对应中位数 for idx, col in enumerate(dataset_1): # 方式1:用inplace=True直接修改原数据 dataset_1[col].replace('?', medias[idx], inplace=True) # 方式2:赋值回原列(推荐,避免inplace可能带来的副作用) # dataset_1[col] = dataset_1[col].replace('?', medias[idx])
额外说明
- 如果你的列原本是
object类型(因为包含'?'字符串),替换为数值型中位数后,列会自动转为数值类型,这是合理的转换。 - 计算中位数时显式转为
float是必要的:如果列是object类型,直接调用median()可能报错,因为pandas无法对混合字符串和数字的列计算中位数。
内容的提问来源于stack exchange,提问作者Lucas Leite
相关产品推荐
相关产品推荐

