【问题标题】:Replace NaN with random number用随机数替换 NaN
【发布时间】:2021-05-05 13:45:03
【问题描述】:
我有一个数字数据框,例如:
A B
2019-10-31 0.035333
2019-10-31 NaN
2019-11-30 -0.108532
2019-11-30 -0.030604
2019-11-30 NaN
我想用随机高斯数替换 B 列中的 NaN:
from random import seed
from random import gauss
# seed random number generator
seed(1)
# generate some Gaussian value
value = gauss(0, 0.1)
但是,如果我使用以下代码:
df.fillna(gauss(0, 0.1))
它用相同的随机值填充所有缺失值,而我希望每个 NaN 都有一个新的随机值。我应该如何实现这一点?
【问题讨论】:
标签:
python
pandas
random
fillna
【解决方案1】:
您可以使用np.random 生成整个数组,然后使用loc 填充nan:
mask = df['B'].isna()
to_fill = np.random.normal(0,0.1, size=mask.sum())
df.loc[mask, 'B'] = to_fill
【解决方案2】:
或者如果你只是想使用gauss:
df['B'] = df['B'].fillna(df['B'].apply(lambda x: gauss(0,.1)))
输出:
A B
0 2019-10-31 0.035333
1 2019-10-31 -0.143683
2 2019-11-30 -0.108532
3 2019-11-30 -0.030604
4 2019-11-30 0.054647
【解决方案3】:
Python pandas 建议替换函数。
df.replace('NaN', gauss(1, 0.1))
输出:
A B
0 2019-10-31 0.035330
1 2019-10-31 -0.036289
2 2019-11-30 -0.108532
3 2019-11-30 -0.030604
4 2019-11-30 -0.036289
【解决方案4】:
df.B.where(df.B.notna(), np.random.randn(len(df.index))*0.1 + 0)
如果B 列不是 NaN,则取自 np.random.randn,否则保持原样
得到
0 0.035333
1 -0.006504
2 -0.108532
3 -0.030604
4 -0.337191
Name: B, dtype: float64