我有一个列表users=['a','b','c','d']
我有一个数据帧X有100行。我想用列表用户填充X['users']
,例如
- 分布均匀。在上面的例子中,每个 元素必须有25个条目。
- 以随机方式进行分布。每次运行时,它不应该有固定的分布模式。
abcdabcd vs aaabbbcccddd vs accbddab
均为有效分布。
我该怎么做呢?
将每个元素(users*25
)的25传递给np.random.Generator.choice
(或已弃用的np.random.choice
),并设置replace=False
:
users = list('abcd')
X = pd.DataFrame()
rng = np.random.default_rng(0)
X['users'] = rng.choice(users*25, size=100, replace=False)
# users
# 0 d
# 1 d
# 2 b
# 3 a
# ...
X.value_counts()
# users
# a 25
# b 25
# c 25
# d 25
# dtype: int64
在额外的运行中,我们得到不同的采样,但总是每个元素25个:
X['users'] = rng.choice(users*25, size=100, replace=False)
# users
# 0 b
# 1 b
# 2 c
# 3 c
# ...
X.value_counts()
# users
# a 25
# b 25
# c 25
# d 25
# dtype: int64
所以,假设我们有一个df
有100行,我想我们可以使用np.repeat
。
import numpy as np
import pandas as pd
X = pd.DataFrame(np.zeros((100, 1)), columns=['users'])
users = ['a','b','c','d'] # users = ['a']
n_users = len(users)
n_rows = X.shape[0]
n_per_user = n_rows // n_users
if n_users == 1:
users = np.repeat(users, n_rows)
else:
np.random.shuffle(users)
users = np.repeat(users, n_per_user)
if n_rows % n_users != 0:
n_extra = n_rows % n_users
extra_users = np.random.choice(users, n_extra, replace=False)
users = np.concatenate([users, extra_users])
X['users'] = users