如何在DataFrame中随机选择指定比例的值并设置为0?
解决DataFrame随机置0指定比例元素的问题
要实现将DataFrame中1/10的元素随机设为0,且不局限于特定行或列,推荐以下高效方法:
方法一:利用扁平索引直接修改(最优)
这种方式将整个DataFrame视为一维数组,随机选择不重复的索引进行修改,保证每个元素被选中的概率一致,且实现高效:
import numpy as np import pandas as pd # 计算需要置0的元素数量(123*100/10=1230) num_to_zero = df.size // 10 # 生成不重复的随机扁平索引 random_indices = np.random.choice(df.size, num_to_zero, replace=False) # 直接修改对应位置的值为0 df.values.flat[random_indices] = 0
方法二:生成随机行列对修改
如果需要更直观地控制行和列的选择,可以生成随机的行号和列号组合,同时避免重复选中同一位置:
import numpy as np import pandas as pd num_to_zero = df.size // 10 # 生成所有可能的(row, col)位置对 all_positions = [(row, col) for row in range(df.shape[0]) for col in range(df.shape[1])] # 随机挑选指定数量的位置 selected = np.random.choice(len(all_positions), num_to_zero, replace=False) # 遍历选中的位置置0 for idx in selected: row, col = all_positions[idx] df.iloc[row, col] = 0
为什么不推荐固定行列交叉的方式
你之前尝试的选择12行+10列交叉区域的方法,会导致置0的元素集中在这些行和列的交叉点,无法实现全局随机分布,而且实际修改的元素数量(12*10=120)远小于需要的1230个,不符合需求。
内容的提问来源于stack exchange,提问作者CinfaCinfa
相关产品推荐
相关产品推荐

