将列表中的数据分布到panda数据框架中的列中



我有一个列表users=['a','b','c','d']

我有一个数据帧X有100行。我想用列表用户填充X['users'],例如

  1. 分布均匀。在上面的例子中,每个
  2. 元素必须有25个条目。
  3. 以随机方式进行分布。每次运行时,它不应该有固定的分布模式。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

相关内容

  • 没有找到相关文章

最新更新