如何用Pandas按指定概率随机替换数据集中的缺失值?
按非缺失值分布概率替换缺失值的实现方法
直接上可运行的步骤和代码,核心是用numpy按指定概率生成随机样本,再批量替换缺失值:
先获取正确的非缺失值分布
你之前的代码没排除"?",会导致概率计算包含缺失值,所以先过滤掉"?"再算占比:# 提取Feature1列非"?"的所有值,计算各唯一值的占比 feature1_dist = df[df['Feature1'] != ' ?']['Feature1'].value_counts(normalize=True)定位缺失值位置并确定需要填充的样本数量
# 找出所有Feature1为"?"的行索引 missing_indices = df[df['Feature1'] == ' ?'].index # 统计缺失值的数量 n_missing = len(missing_indices)按概率生成填充样本
用np.random.choice直接按分布抽取对应数量的样本,比循环高效得多:import numpy as np # 从非缺失值的唯一值中,按之前计算的概率抽取n_missing个样本 filled_values = np.random.choice(feature1_dist.index, size=n_missing, p=feature1_dist.values)批量替换缺失值
用loc直接定位缺失位置赋值,避免循环逐个处理:df.loc[missing_indices, 'Feature1'] = filled_values
补充说明
- 循环逐个处理在数据量大的时候会很慢,批量操作是Pandas的最优实践
- 确保
feature1_dist.values的概率和为1(Pandas的value_counts(normalize=True)会自动处理,只要非缺失值不为空)
内容的提问来源于stack exchange,提问作者Hosna Asgari
相关产品推荐
相关产品推荐

