我有一个包含 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)
。没有必要像 Python 2.x 中那样浪费内存分配 range(low, high)
;如果 high
很大的话,可能需要很多内存。
df1['randNumCol'] = np.random.randint(0,5, size=len(df1))
备注:
size
只是一个整数。一般来说,如果我们想生成一个randint()s
的数组/数据框,大小可以是一个元组,如Pandas:如何创建随机整数的数据框?)range(low, high)
不再分配列表(可能使用大量内存),它会生成一个range()
对象random.seed(...)
,以获得确定性和可重复性不需要额外导入 numpy 的选项:
df1['randNumCol'] = pd.Series(range(1,6)).sample(int(5e4), replace=True).array
randint
适合生成小型数组,但对于较大的数组,Numpy 的随机生成器(例如 Generator.integers
)速度更快,尤其是在可供选择的整数范围很大的情况下。要使用它,请构造 numpy.random.default_rng()
并调用适当的方法,例如integers
、choice
、normal
、standard_normal
等。以下是生成 len(df1)
数量在 1 到 4 之间的伪随机整数并将其分配给列的示例。
import numpy as np
df1['randNumCol'] = np.random.default_rng().integers(1, 5, len(df1))
对于可重现的数字数组,您可以在同一行中的生成器中设置随机种子:
df1['randNumCol'] = np.random.default_rng(2023).integers(1, 5, len(df1))
# ^^^^ <--- set seed here
如果范围从0开始或者范围不连续,则可以使用
Generator.choice
(并且它比choice
快得多):
# sample from numbers from 0 to 4
rng = np.random.default_rng()
df1['randNumCol'] = rng.choice(5, len(df1))
# sample from the given list
df1['randNumCol'] = rng.choice([1, 2, 4], len(df1))
正如下面的 timeit 测试所示,
Generator.integers
比 randint
快约 60%。
df1 = pd.DataFrame(index=range(100_000_000))
%timeit df1['randNumCol'] = np.random.randint(1, 50, len(df1))
# 1.43 s ± 23.3 ms per loop (mean ± std. dev. of 5 runs, 10 loops each)
%timeit df1['randNumCol'] = np.random.default_rng().integers(1, 50, len(df1))
# 886 ms ± 31.7 ms per loop (mean ± std. dev. of 5 runs, 10 loops each)