Pandas:使用范围内的随机整数在 df 中创建新列

问题描述 投票:0回答:4

我有一个包含 50k 行的 pandas 数据框。我正在尝试添加一个新列,该列是从 1 到 5 随机生成的整数。

如果我想要 50k 随机数,我会使用:

df1['randNumCol'] = random.sample(xrange(50000), len(df1))

但为此我不知道该怎么做。

R 中的旁注,我会这样做:

sample(1:5, 50000, replace = TRUE)

有什么建议吗?

python pandas random integer range
4个回答
165
投票

一种解决方案是使用

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)


36
投票

要添加随机整数列,请使用

randint(low, high, size)
。没有必要像 Python 2.x 中那样浪费内存分配
range(low, high)
;如果
high
很大的话,可能需要很多内存。

df1['randNumCol'] = np.random.randint(0,5, size=len(df1))

备注:


4
投票

不需要额外导入 numpy 的选项:

df1['randNumCol'] = pd.Series(range(1,6)).sample(int(5e4), replace=True).array

0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.