用随机值填充连续变量列空值失效,应如何修正代码实现功能?
问题原因分析
- 操作逻辑倒置:
df.mask(condition)方法的作用是将数据框中条件为True的位置替换为NaN,你现有代码的效果是随机将全表20%的有效数据置为空,和“填充空值”的目标完全相反。 - 操作范围错误:代码作用于整个数据框,没有单独筛选连续变量列,会误修改分类、文本等非连续列的数据。
- 无赋值操作:pandas的所有转换方法默认返回修改后的新对象,你没有将运行结果赋值给原变量或者新变量,运行后原数据框不会发生任何变更。
- 缺少填充逻辑:整段代码没有任何针对已有空值的赋值规则,自然无法实现填充效果。
调整后实现代码
如果你是要填充数据框中已存在的连续变量列空值,可以使用如下代码:
import numpy as np import pandas as pd # 筛选所有连续数值类型的列 continuous_cols = df.select_dtypes(include=['number']).columns # 遍历每一列填充空值 for col in continuous_cols: # 跳过没有空值的列 na_count = df[col].isna().sum() if na_count == 0: continue # 取当前列非空值的最小、最大值作为随机数生成范围,保证填充值符合列的数值分布区间 col_min = df[col].min() col_max = df[col].max() # 生成随机数填充到空值位置 df.loc[df[col].isna(), col] = np.random.uniform(low=col_min, high=col_max, size=na_count)
如果你原本的需求是先随机将连续列20%的数值置为空,再用随机数填充这些空值,可以使用如下代码:
import numpy as np import pandas as pd # 筛选所有连续数值类型的列 continuous_cols = df.select_dtypes(include=['number']).columns # 随机将连续列20%的数值置为空 df[continuous_cols] = df[continuous_cols].mask(np.random.choice([True, False], size=df[continuous_cols].shape, p=[.2,.8])) # 遍历填充空值 for col in continuous_cols: na_count = df[col].isna().sum() if na_count == 0: continue col_min = df[col].min() col_max = df[col].max() df.loc[df[col].isna(), col] = np.random.uniform(low=col_min, high=col_max, size=na_count)
内容的提问来源于stack exchange,提问作者lili AHSSLH
相关产品推荐
相关产品推荐

