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

如何用中位数替换数据集中的'?'?代码失效问题求助

问题分析与解决

你的代码有两个核心错误导致替换无效:

  1. 双重循环逻辑错误
    你用两层循环让每个列遍历所有中位数进行替换,这完全不符合需求——每个列只需要对应medias列表里同位置的那个中位数,不需要遍历所有中位数。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:54:43