用随机数替换 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
我有一个数字数据框,例如:
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
:
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