如何用iv1现有分布的不同随机值替换dataframe中iv1的NA值
解决从有效值分布抽取不同随机值替换NA的问题
我明白你的需求啦——你想要给raw数据框里iv1的NA值替换成从现有有效值分布中抽取的不同随机值,而不是单一值,同时还要把有效值的分布存到dbmi里计算均值和标准差。咱们来一步步解决这个问题:
第一步:提取有效值并创建dbmi数据框
首先,我们从raw中提取iv1的非NA值,存入dbmi,并计算它的均值和标准差:
import pandas as pd import numpy as np # 提取iv1的有效值,复制到dbmi中 dbmi = raw[raw['iv1'].notna()][['iv1']].copy() # 在dbmi中计算并添加均值和标准差列 dbmi['mean_iv1'] = dbmi['iv1'].mean() dbmi['std_iv1'] = dbmi['iv1'].std()
第二步:用不同随机值替换NA
之前的问题应该是只生成了单个随机值来替换所有NA,现在我们要生成和NA数量一致的随机样本,有两种常见方式:
方式1:从现有有效值中直接抽样(有放回)
这种方式完全贴合原始有效值的分布,适合不想假设分布类型的场景:
# 统计iv1中NA的数量 na_count = raw['iv1'].isna().sum() # 从dbmi的iv1有效值中抽取对应数量的随机样本(有放回) random_samples = np.random.choice(dbmi['iv1'], size=na_count, replace=True) # 将随机样本替换回raw的NA位置 raw.loc[raw['iv1'].isna(), 'iv1'] = random_samples
方式2:基于有效值的正态分布生成随机值
如果假设iv1的有效值服从正态分布,可以用均值和标准差生成新的随机值:
na_count = raw['iv1'].isna().sum() # 基于dbmi中的均值和标准差,生成对应数量的正态分布随机值 random_samples = np.random.normal( loc=dbmi['mean_iv1'].iloc[0], scale=dbmi['std_iv1'].iloc[0], size=na_count ) raw.loc[raw['iv1'].isna(), 'iv1'] = random_samples
验证效果
运行完代码后,你可以检查raw['iv1']的NA值是否都被替换,且替换的值是不同的:
# 检查是否还有NA print(raw['iv1'].isna().sum()) # 查看替换后的随机值 print(raw[raw['iv1'].isna() == False]['iv1'].tail(na_count))
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

