用随机数替换 NaN

时间:2021-05-05 13:45:03

标签: python pandas random fillna

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

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 的新随机值。我应该如何做到这一点?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

或者,如果您只想使用 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 :(得分:0)

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