我有一个包含50k行的pandas数据框架。我正在尝试添加一个新列,这是一个随机生成的整数从1到5。
如果我想要50k个随机数,我会使用:
df1['randNumCol'] = random.sample(xrange(50000), len(df1))
但是对于这个我不知道该怎么做。
R的边注,我会这样做:
sample(1:5, 50000, replace = TRUE)
有什么建议吗?
一个解决方案是使用numpy.random.randint
:
import numpy as np
df1['randNumCol'] = np.random.randint(1, 6, df1.shape[0])
或者如果数字是非连续的(尽管速度较慢),您可以这样使用:
df1['randNumCol'] = np.random.choice([1, 9, 20], df1.shape[0])
为了使结果可重复,您可以使用numpy.random.seed
(例如np.random.seed(42)
)设置种子
添加一列随机整数,使用randint(low, high, size)
。没有必要浪费内存分配range(low, high)
,这是Python 2.x中曾经做过的;如果high
是大的,这可能是很多内存。
df1['randNumCol'] = np.random.randint(0,5, size=len(df1))
指出:
- 当我们只添加一个列时,
size
只是一个整数。一般来说,如果我们想要生成randint()s
的数组/数据帧,大小可以是元组,如Pandas:如何创建随机整数的数据帧?) - 在Python 3中。x
range(low, high)
不再分配列表(可能使用大量内存),它产生range()
对象 - 预先使用
random.seed(...)
,以确保确定性和可重复性
一个不需要为numpy额外导入的选项:
df1['randNumCol'] = pd.Series(range(1,6)).sample(int(5e4), replace=True).array