如何在Pandas DataFrame中随机为50%的单元格赋值'X'?
问题与解决方案
问题背景
现有如下Pandas DataFrame:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
通过以下代码可将DataFrame中50%随机选中行的所有列赋值为'X':
samples_indices = df.sample(frac=0.5, replace=False).index df.loc[samples_indices] = 'X'
执行后效果:
X X X X 1 1 1 1 X X X X 1 1 1 1
需求:为DataFrame中50%的随机单元格赋值'X',示例效果如下:
X X X 1 1 X 1 1 X X X 1 1 1 1 X
解决方案
方法1:使用numpy生成随机掩码(快速简洁)
利用numpy生成与DataFrame形状一致的随机布尔矩阵,直接定位需要修改的单元格:
import pandas as pd import numpy as np # 构造初始全1的4x4 DataFrame df = pd.DataFrame(np.ones((4, 4), dtype=int)) # 生成掩码:50%概率为True,对应需要设为'X'的单元格 mask = np.random.choice([True, False], size=df.shape, p=[0.5, 0.5]) # 为掩码选中的单元格赋值 df[mask] = 'X'
方法2:通过stack抽样(精确控制选中数量)
如果需要确保精确选中50%的单元格(当总单元格数为偶数时),可以将DataFrame堆叠为一维Series后抽样:
import pandas as pd import numpy as np df = pd.DataFrame(np.ones((4, 4), dtype=int)) # 将DataFrame堆叠为一维Series,每个元素对应原DataFrame的一个单元格 stacked_df = df.stack() # 抽取50%的元素 sampled_cells = stacked_df.sample(frac=0.5) # 将选中的单元格设为'X' stacked_df.loc[sampled_cells.index] = 'X' # 还原为原形状的DataFrame df = stacked_df.unstack()
内容的提问来源于stack exchange,提问作者peter_parker
相关产品推荐
相关产品推荐

