如何在pandas中用列现有最大最小值之间的随机值替换缺失值NaN
问题原因分析
原代码存在几个核心逻辑问题:
applymap是逐单元格处理函数,传入自定义函数的参数是单个单元格的值,不是整个DataFrame,函数内部的循环逻辑完全不生效- 函数内遇到第一个值就直接return,根本不会处理后续的缺失值
- 无法获取当前单元格所属列的最大、最小值,范围计算逻辑完全失效
正确实现代码
import numpy as np import pandas as pd def fill_nan_with_col_range_unique(df): # 遍历每一列处理 for col in df.columns: # 跳过日期列,保持原值不变 if pd.api.types.is_datetime64_any_dtype(df[col]) or col == "Date": continue # 获取当前列非空值的上下限 col_min = df[col].min() col_max = df[col].max() # 统计当前列缺失值数量 nan_count = df[col].isna().sum() if nan_count == 0: continue # 生成足够多的区间内随机值,去重后取对应数量保证不重复 rand_vals = np.random.uniform(col_min, col_max, size=nan_count * 2) rand_vals = np.unique(rand_vals)[:nan_count] # 填充到缺失值位置 df.loc[df[col].isna(), col] = rand_vals return df # 测试示例 d = {'Date': ['2015-09-01 09:00:00', '2015-09-02 09:00:00','2015-09-03 09:00:00','2015-09-01 09:00:00',], 'col2': [np.nan, 102,np.nan,105], 'col3': [1, np.nan,3,2.5,], 'col4': [0.0001, 0.0002,np.nan,0.0003]} df = pd.DataFrame(data=d) df['Date'] = pd.to_datetime(df['Date']) df_filled = fill_nan_with_col_range_unique(df) print(df_filled)
效果说明
- 所有数值列的缺失值都会用该列非空值的最小值到最大值区间内的随机值填充
- 每列的填充值互不重复,符合需求
- 日期列不会被修改
- 按列处理的逻辑比逐单元格遍历效率更高,适配大数据量场景
内容的提问来源于stack exchange,提问作者flashliquid
相关产品推荐
相关产品推荐

