python - 如何将列表中的随机值分配给同一行的另一列中不存在的新列?
问题描述
我有一个大约 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_id
并reviewers = df['user_id'].unique().tolist()
对其进行迭代并分配审阅者 ID,但我知道你通常不应该迭代熊猫数据帧。所以我不知道如何去做这样的事情。
解决方案
我能想到的最简单的方法是不断更换审稿人,直到没有人审阅自己的作品:
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
推荐阅读
- compression - 如何使用 igraph 将 edgelist 转换为压缩稀疏行格式?
- javascript - Vue 延迟加载组件
- maven - Spring Cloud 快速入门不起作用
- sql - 如何从gorm将float32数组保存为双精度
- sql-server - 子字符串 charindex 不起作用
- vba - 根据另一个工作簿中的数据在新工作簿中创建数据透视表
- kotlin - Kotlin - 为什么我会得到 KotlinNullPointerException
- c++ - 推断成员函数的返回类型
- javascript - Javascript 应用程序中是否有脚本扩展的先例?
- python - 将字符串与django中的数据库匹配