首页 > 解决方案 > 如何将列表中的随机值分配给同一行的另一列中不存在的新列?

问题描述

我有一个大约 50k~ 行的数据集,其中有一个特定的作业 ID 和执行该作业的人的用户 ID。它由我创建的这个示例表示:

df = pd.DataFrame(data={
    'job_id': ['00001', '00002', '00003', '00004', '00005', '00006', '00007', '00008', '00009', '00010', '00011', '00012', '00013', '00014', '00015'],
    'user_id': ['frank', 'josh', 'frank', 'jessica', 'josh', 'eric', 'frank', 'josh', 'eric', 'jessica', 'jessica', 'james', 'frank', 'josh', 'james']
})


    job_id  user_id
0   00001   frank
1   00002   josh
2   00003   frank
3   00004   jessica
4   00005   josh
5   00006   eric
6   00007   frank
7   00008   josh
8   00009   eric
9   00010   jessica
10  00011   jessica
11  00012   james
12  00013   frank
13  00014   josh
14  00015   james

我希望在名为“reviewer_id”的新列中为这些工作分配同行评审员,其中评审员来自 user_id 的列表,但不能相同user_id。例如:frank不能回顾自己的工作,但jessica可以。

我想要的输出是这样的:

    job_id  user_id reviewer_id
0   00001   frank   jessica
1   00002   josh    frank
2   00003   frank   josh
3   00004   jessica eric
4   00005   josh    james
...
11  00012   james   frank
12  00013   frank   josh
13  00014   josh    eric
14  00015   james   eric

我对 python 很陌生,所以我只能想到从数据帧中获取唯一列表user_idreviewers = df['user_id'].unique().tolist()对其进行迭代并分配审阅者 ID,但我知道你通常不应该迭代熊猫数据帧。所以我不知道如何去做这样的事情。

标签: pythonpandasrandom

解决方案


我能想到的最简单的方法是不断更换审稿人,直到没有人审阅自己的作品:

users = df['user_id'].unique()
df['reviewer_id'] = df['user_id']
self_review = lambda: df['reviewer_id'] == df['user_id']

while self_review().any():
    reviewers = np.random.choice(users, len(df))
    df['reviewer_id'] = df['reviewer_id'].mask(self_review(), reviewers)

在性能方面,当有更多不同的用户时,代码运行得更快。这是一个更快的版本(海象运算符需要 Python 3.8 :=):

users = df['user_id'].unique()
df['reviewer_id'] = df['user_id']

while (self_review := df['user_id'] == df['reviewer_id']).any():
    reviewers = np.random.choice(users, self_review.sum())
    df.loc[self_review, 'reviewer_id'] = reviewers

推荐阅读