用随机数替换 NaN

Replace NaN with random number

我有一个数字数据框,例如:

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 分配一个新的随机值。我该如何实现?

您可以用 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
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

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

或者如果您只想使用 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