如何用指定范围内的随机数替换Pandas DataFrame中的NaN值
用均匀分布随机数填充Pandas DataFrame的NaN值(基于列内已有值范围)
原始数据示例
代码
import pandas as pd details = { 'info1' : [10,None,None,None,None,None,15,None,None,None,5], 'info2' : [15,None,None,None,10,None,None,None,None,None,20], } df = pd.DataFrame(details)
对应DataFrame
| info1 | info2 | |
|---|---|---|
| 0 | 10 | 15 |
| 1 | NaN | NaN |
| 2 | NaN | NaN |
| 3 | NaN | NaN |
| 4 | NaN | 10 |
| 5 | NaN | NaN |
| 6 | 15 | NaN |
| 7 | NaN | NaN |
| 8 | NaN | NaN |
| 9 | NaN | NaN |
| 10 | 5 | 20 |
解决方案
核心思路
针对每一列,提取该列已有非NaN值的最小值和最大值作为均匀分布的取值范围,为该列的每个NaN位置生成对应范围内的随机数,完成替换。
完整代码实现
需要借助numpy生成均匀分布随机数,代码如下:
import pandas as pd import numpy as np # 构建原始DataFrame details = { 'info1' : [10,None,None,None,None,None,15,None,None,None,5], 'info2' : [15,None,None,None,10,None,None,None,None,None,20], } df = pd.DataFrame(details) # 遍历列填充NaN for col in df.columns: # 获取当前列有效数据的最小、最大值 col_min = df[col].min() col_max = df[col].max() # 生成对应数量的均匀分布随机数 random_vals = np.random.uniform(low=col_min, high=col_max, size=df[col].isna().sum()) # 替换NaN值 df.loc[df[col].isna(), col] = random_vals # 查看填充结果 print(df)
补充说明
np.random.uniform(low, high, size):生成size个在[low, high)区间内的均匀分布随机数- 若需要控制随机数的小数位数,可在生成后添加
round()处理,例如:random_vals = np.random.uniform(...).round(2) - 每列的取值范围完全由自身已有数据决定,保证填充值与列内原有数据的数值区间匹配
内容的提问来源于stack exchange,提问作者user14272
相关产品推荐
相关产品推荐

