为何在Pandas的assign方法中使用random模块会返回相同数值?
为什么
assign结合random.randint生成的列全是相同值? 核心原因
random.randint(1,100)是单次调用生成一个单一整数,当你把它传给assign时,Pandas会将这个单一值广播到整个列的所有行,因此整列数值完全相同。- 你之前的误解是认为
assign会为每一行单独调用一次random.randint,但实际上assign的参数是先计算出结果再赋值给列——也就是说,random.randint(1,100)在assign执行前就已经算出一个固定值,之后这个值被填充到列的每一行。
对比np.random.randint的逻辑
np.random.randint(1, 100, size=n)是直接生成一个长度为n的随机整数数组,每个元素都是独立的随机值,因此赋值给列后每一行数值不同。注意:numpy的randint是左闭右开区间,若要包含100,需写成np.random.randint(1, 101, size=n)。
正确的assign用法
如果你想用assign生成整列不同的随机值,有两种可行方式:
- 推荐:用numpy矢量化随机函数(效率更高)
df_test = df_test.assign(randomNumber = np.random.randint(1, 101, size=n))
矢量化操作是Pandas和numpy的最佳实践,远快于逐行处理。
- 逐行生成(适合自定义逐行逻辑场景)
df_test = df_test.assign(randomNumber = lambda df: [random.randint(1,100) for _ in range(len(df))])
或者用apply逐行调用:
df_test = df_test.assign(randomNumber = lambda df: df.apply(lambda _: random.randint(1,100), axis=1))
注意:这种逐行处理效率较低,数据量大时不建议使用。
内容的提问来源于stack exchange,提问作者freshpork
相关产品推荐
相关产品推荐

