使用np.random.randint实现Pandas DataFrame列随机掩码问题咨询
问题原因
你原来的写法里np.random.randint(1,3)只会生成1个固定的随机整数,所以mask方法会把所有符合df['A']>1条件的行统一替换成这个固定值,自然所有行的替换结果都一样。
另外额外提一句:np.random.randint的取值范围是左闭右开,你写的(1,3)只能生成1、2两个值,要拿到1~3的随机整数需要把上限改成4。
实现方法
只要给替换位置传入和对应行数长度一致的随机数组即可,有两种常用写法:
写法1:直接生成和DataFrame等长的随机数组
适合数据量不大的场景,写法最简单:
df['A'] = df['A'].mask(df['A'] > 1, np.random.randint(1, 4, size=len(df)))
size=len(df)参数会生成和df行数相同的一维随机数组,每个位置的数值独立随机,对应替换每一行的符合条件的值。
写法2:仅给需要替换的行生成随机数
适合数据量大、符合条件的行占比不高的场景,效率更高:
# 先筛选出需要替换的行的掩码 mask = df['A'] > 1 # 只给符合条件的位置生成对应数量的随机数 df.loc[mask, 'A'] = np.random.randint(1, 4, size=mask.sum())
内容的提问来源于stack exchange,提问作者johnmelvin esguerra
相关产品推荐
相关产品推荐

