Ib *_*b D 5 python numpy nan dataframe pandas
考虑到起始数据中已经存在空值,我如何将NaN值随机引入到我的数据集中,用于每列。
我想按列获取例如NaN值的20%。
例如:
如果我在数据集中有3列:每个列都有“ A”,“ B”和“ C”,则我具有NaN值率如何按列随机引入NaN值以达到每列20%:
A: 10% nan
B: 15% nan
C: 8% nan
Run Code Online (Sandbox Code Playgroud)
目前,我尝试使用此代码,但它会使我的数据集降级太多,我认为这不是好方法:
df = df.mask(np.random.choice([True, False], size=df.shape, p=[.20,.80]))
Run Code Online (Sandbox Code Playgroud)
我不确定最后一部分是什么意思(“降级太多”),但这是一个粗略的方法。
import numpy as np
import pandas as pd
A = pd.Series(np.arange(99))
# Original missing rate (for illustration)
nanidx = A.sample(frac=0.1).index
A[nanidx] = np.NaN
###
# Complementing to 20%
# Original ratio
ori_rat = A.isna().mean()
# Adjusting for the dataframe without missing values
add_miss_rat = (0.2 - ori_rat) / (1 - ori_rat)
nanidx2 = A.dropna().sample(frac=add_miss_rat).index
A[nanidx2] = np.NaN
A.isna().mean()
Run Code Online (Sandbox Code Playgroud)
显然,它并不总是恰好是 20%......
更新 将其应用于整个数据框
for col in df:
ori_rat = df[col].isna().mean()
if ori_rat >= 0.2: continue
add_miss_rat = (0.2 - ori_rat) / (1 - ori_rat)
vals_to_nan = df[col].dropna().sample(frac=add_miss_rat).index
df.loc[vals_to_nan, col] = np.NaN
Run Code Online (Sandbox Code Playgroud)
更新 2NaN我进行了更正,以在计算比率时
也考虑到删除值的影响。