我有一个数字数据框,例如:
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 的新随机值。我应该如何做到这一点?
答案 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