如何基于列均值与标准差生成不同随机值替换单元格中的NaN值
问题原因
- 不添加
size参数时np.random.randint仅返回单个整数,fillna会用该单个值填充所有空单元格,所以所有空值都是重复值。 - 添加
size参数后返回的是numpy数组,pandas.Series.fillna的value参数不支持直接传入numpy数组,所以触发类型错误。
单列填充解决方案
直接定位空值的位置,生成对应数量的随机数后赋值即可,代码如下:
import os import pandas as pd import numpy as np filename = os.path.join(os.path.dirname(__file__),'exam.csv') data = pd.read_csv(filename) # 计算Math列的均值和标准差 math_mean = data['Math'].mean() math_std = data['Math'].std() low = int(math_mean - math_std) high = int(math_mean + math_std) + 1 # 适配np.random.randint左闭右开的特性,保证包含上限值 # 统计空值数量,生成对应数量的随机数,直接赋值给空值位置 na_count = data['Math'].isna().sum() if na_count > 0: random_grades = np.random.randint(low, high, size=na_count) data.loc[data['Math'].isna(), 'Math'] = random_grades print(data)
多列批量填充扩展
如果后续需要处理多列,可以用循环批量实现:
# 定义需要填充的列名列表 cols_to_fill = ['Math', 'English', 'Chemistry'] for col in cols_to_fill: col_mean = data[col].mean() col_std = data[col].std() low = int(col_mean - col_std) high = int(col_mean + col_std) + 1 na_count = data[col].isna().sum() if na_count > 0: data.loc[data[col].isna(), col] = np.random.randint(low, high, size=na_count)
内容的提问来源于stack exchange,提问作者Robin Sage
相关产品推荐
相关产品推荐

