如何在 Python 上用不同的随机数填充 NaN 值?
How do I fill NaN values with different random numbers on Python?
我想用人们的年龄(它还包含数值,而不仅仅是 NaN 值)替换一列中缺失的值,但到目前为止我尝试过的所有方法都无法按照我想要的方式工作,或者它根本不起作用。
我希望应用一个随机变量生成器,它使用从该列获得的均值和标准差服从正态分布。
我尝试了以下方法:
用 numpy 替换,用 相同的数字 替换 NaN 值
df_travel['Age'] = df_travel['Age'].replace(np.nan, round(rd.normalvariate(age_mean, age_std),0))
用 pandas 填充 NaN 值,但用 相同的数字 替换所有值
df_travel['Age'] = df_travel['Age'].fillna(round(rd.normalvariate(age_mean, age_std),0))
使用 pandas 在数据帧上应用函数替换 NaN 值,但 也会更改所有现有数值(我只想填充NaN 值)
df_travel['Age'] = df_travel['Age'].where(df_travel['Age'].isnull() == True).apply(lambda v: round(rd.normalvariate(age_mean, age_std),0))
如有任何想法,我们将不胜感激。提前致谢。
Series.fillna
可以接受一个Series,所以生成一个大小为len(df_travel)
:
的随机数组
rng = np.random.default_rng(0)
mu = df_travel['Age'].mean()
sd = df_travel['Age'].std()
filler = pd.Series(rng.normal(loc=mu, scale=sd, size=len(df_travel)))
df_travel['Age'] = df_travel['Age'].fillna(filler)
我会按照以下方式处理:
# compute mean and std of `Age`
age_mean = df['Age'].mean()
age_std = df['Age'].std()
# number of NaN in `Age` column
num_na = df['Age'].isna().sum()
# generate `num_na` samples from N(age_mean, age_std**2) distribution
rand_vals = age_mean + age_std * np.random.randn(num_na)
# replace missing values with `rand_vals`
df.loc[df['Age'].isna(), 'Age'] = rand_vals
我想用人们的年龄(它还包含数值,而不仅仅是 NaN 值)替换一列中缺失的值,但到目前为止我尝试过的所有方法都无法按照我想要的方式工作,或者它根本不起作用。
我希望应用一个随机变量生成器,它使用从该列获得的均值和标准差服从正态分布。
我尝试了以下方法:
用 numpy 替换,用 相同的数字 替换 NaN 值
df_travel['Age'] = df_travel['Age'].replace(np.nan, round(rd.normalvariate(age_mean, age_std),0))
用 pandas 填充 NaN 值,但用 相同的数字 替换所有值
df_travel['Age'] = df_travel['Age'].fillna(round(rd.normalvariate(age_mean, age_std),0))
使用 pandas 在数据帧上应用函数替换 NaN 值,但 也会更改所有现有数值(我只想填充NaN 值)
df_travel['Age'] = df_travel['Age'].where(df_travel['Age'].isnull() == True).apply(lambda v: round(rd.normalvariate(age_mean, age_std),0))
如有任何想法,我们将不胜感激。提前致谢。
Series.fillna
可以接受一个Series,所以生成一个大小为len(df_travel)
:
rng = np.random.default_rng(0)
mu = df_travel['Age'].mean()
sd = df_travel['Age'].std()
filler = pd.Series(rng.normal(loc=mu, scale=sd, size=len(df_travel)))
df_travel['Age'] = df_travel['Age'].fillna(filler)
我会按照以下方式处理:
# compute mean and std of `Age`
age_mean = df['Age'].mean()
age_std = df['Age'].std()
# number of NaN in `Age` column
num_na = df['Age'].isna().sum()
# generate `num_na` samples from N(age_mean, age_std**2) distribution
rand_vals = age_mean + age_std * np.random.randn(num_na)
# replace missing values with `rand_vals`
df.loc[df['Age'].isna(), 'Age'] = rand_vals