You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按条件与范围为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列分配用户,满足两个核心条件:

  1. 每个用户有任务分配上限(示例中dude最多分配4个任务,user2最多分配3个);
  2. 每个用户仅能分配同一种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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:45:25