用随机数替换NaN

3

我有一个数字数据框:

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 都有一个新的随机值。我该如何实现这一点?

1
这个回答解决了你的问题吗?https://dev59.com/m1oV5IYBdhLWcg3wc-jo - Zoro
4个回答

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
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

1

Python的pandas库提供了replace函数。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接