在熊猫中生成随机字符串

clh*_*007 5 pandas

我想创建一个包含200个不同值的一百万个键的字符串:

N = 1000000 
uniques_keys = [pd.core.common.rands(3) for i in range(200)] 
keys = [random.choice(uniques_keys) for i in range(N)] 
Run Code Online (Sandbox Code Playgroud)

但是,出现以下错误

In [250]:import pandas as pd 

In [251]:pd.core.common.rands(3)
Traceback (most recent call last):

  File "<ipython-input-251-31d12e0a07e7>", line 1, in <module>
    pd.core.common.rands(3)

AttributeError: module 'pandas.core.common' has no attribute 'rands'
Run Code Online (Sandbox Code Playgroud)

我使用的熊猫版本为0.18.0。

Max*_*axU 12

您可以使用:

In [14]: pd.util.testing.rands_array?
Signature: pd.util.testing.rands_array(nchars, size, dtype='O')
Docstring: Generate an array of byte strings.
Run Code Online (Sandbox Code Playgroud)

演示:

In [15]: N = 1000000

In [16]: s_arr = pd.util.testing.rands_array(10, N)

In [17]: s_arr
Out[17]: array(['L6d2GwhHdT', '5oki5T8VYm', 'XKUblAUFyL', ..., 'BE5AdCa62a', 'X3zDFKj6iy', 'iwASB9xZV3'], dtype=object)

In [18]: len(s_arr)
Out[18]: 1000000
Run Code Online (Sandbox Code Playgroud)

更新: 从 2020-04-21

在较新的 Pandas 版本中,您可能会看到以下弃用警告:

FutureWarning:pandas.util.testing 已弃用。请改用 pandas.testing 中公共 API 中的函数。

在这种情况下,按如下方式导入此函数:

from pandas._testing import rands_array
Run Code Online (Sandbox Code Playgroud)


Ian*_*anS 5

有几种解决方案:

第一个解决方案:

该功能现在rands似乎在pandas.util.testing

pd.util.testing.rands(3)
Run Code Online (Sandbox Code Playgroud)

第二种解决方案:

直接进入底层numpy实现(如在pandas源代码中找到):

import string
RANDS_CHARS = np.array(list(string.ascii_letters + string.digits),
                       dtype=(np.str_, 1))

nchars = 3
''.join(np.random.choice(RANDS_CHARS, nchars))
Run Code Online (Sandbox Code Playgroud)

第三个解决方案:

打电话numpy.random.bytes(检查它是否满足您的要求)。

第四个解决方案:

有关其他建议,请参阅此问题