python - 在 pandas 数据框中随机引入 NaN 值
问题描述
考虑到我的起始数据中已经存在的空值,我怎么能随机地将 NaN 值引入我的每列数据集中。
例如,我想按列显示 20% 的 NaN 值。
例如:
如果我的数据集中有 3 列:每列都有“A”、“B”和“C” 我有 NaN 值率如何按列随机引入 NaN 值以达到每列 20%:
A: 10% nan
B: 15% nan
C: 8% nan
目前我尝试了这段代码,但它降低了我的数据集太多,我认为这不是好方法:
df = df.mask(np.random.choice([True, False], size=df.shape, p=[.20,.80]))
解决方案
我不确定最后一部分是什么意思(“降级太多”),但这是一种粗略的方法。
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()
显然,它并不总是正好是 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
更新 2NaN
我进行了更正,以在计算比率时
也考虑到丢弃值的影响。
推荐阅读
- android - 我如何解决在android的片段中集成谷歌地图
- java - 无法在 jxbrowser-java 中设置地理定位权限
- vuejs2 - 如何在 Vuetify 中为图像制作材质框
- sql - 谁能帮助我如何创建任何人都可以通过互联网访问的 SQL 数据库?
- jenkins - Jenkins:它如何查找 Jenkinsfile 位置
- java - 在 tomcat spring 项目上运行 HotswapAgent 的异常
- core-data - 线程1:断点1.1
- python - 根据数据框块将不同的值分配到新列中
- mysql - MySQL CASE 与 COUNT 查询并添加另一列
- r - 如何 R 将 cat() 输出识别为变量名