按条件与范围为DataFrame的user列分配变量的技术实现问题
问题
给定如下DataFrame:
task_name task_id project_id user zoo 10 100 Nan zoo 11 110 Nan foo 22 100 Nan foo 23 110 Nan xyz 33 100 Nan xyz 34 110 Nan qwe 40 100 Nan
其中:
- task_name存在重复值,task_id为唯一值
- project_id仅有两个取值,同一task_name对应两个不同project_id
需要为user列分配用户,满足两个核心条件:
- 每个用户有任务分配上限(示例中
dude最多分配4个任务,user2最多分配3个); - 每个用户仅能分配同一种task_name下的单个任务(即不能给同一用户分配同一个task_name的多个任务)。
期望输出如下:
task_name task_id project_id user zoo 10 100 dude zoo 11 110 user2 foo 22 100 dude foo 23 110 user2 xyz 33 100 dude xyz 34 110 user2 qwe 40 100 dude
尝试过以下代码但未达到预期效果:
df.apply(lambda x: 'dude' if x['project_id'] == 100 else np.nan, axis=1) df.sort_values(by='project_id', inplace=True) df['user'][0:4] = 'dude'
解决方案
可以通过分组遍历+配额跟踪的方式实现需求,具体代码如下:
import pandas as pd import numpy as np # 构造原始DataFrame(如果已有可跳过此步骤) data = { 'task_name': ['zoo', 'zoo', 'foo', 'foo', 'xyz', 'xyz', 'qwe'], 'task_id': [10, 11, 22, 23, 33, 34, 40], 'project_id': [100, 110, 100, 110, 100, 110, 100], 'user': [np.nan]*7 } df = pd.DataFrame(data) # 定义用户及其任务上限 user_quota = {'dude': 4, 'user2': 3} # 跟踪每个用户已分配的任务数 user_task_count = {user: 0 for user in user_quota.keys()} # 按task_name分组处理,确保同一task_name下用户不重复分配 for task_name, group in df.groupby('task_name'): # 记录当前task_name下已分配的用户,避免重复 assigned_users_in_group = [] for idx, row in group.iterrows(): # 筛选出还有配额且未在当前task_name下分配过的用户 available_users = [ user for user in user_quota if user_task_count[user] < user_quota[user] and user not in assigned_users_in_group ] if available_users: selected_user = available_users[0] df.loc[idx, 'user'] = selected_user user_task_count[selected_user] += 1 assigned_users_in_group.append(selected_user) # 打印结果 print(df)
输出结果
task_name task_id project_id user 0 zoo 10 100 dude 1 zoo 11 110 user2 2 foo 22 100 dude 3 foo 23 110 user2 4 xyz 33 100 dude 5 xyz 34 110 user2 6 qwe 40 100 dude
核心逻辑说明
- 分组处理:按
task_name分组,保证同一task_name下的任务不会重复分配给同一个用户; - 配额控制:通过
user_task_count跟踪每个用户已分配的任务数,确保不超过设定的上限; - 用户筛选:每次分配时优先选择还有配额且未在当前task_name下分配过的用户,满足两个条件的约束。
内容的提问来源于stack exchange,提问作者TeoK
相关产品推荐
相关产品推荐

