遍历两个 pandas dfs 并在 python 中的外部函数中使用数据的最佳方法

问题描述 投票:0回答:1

我有两个 pandas dfs,一个包含工作人员列表,另一个包含任务列表。我打算把任务分配给工人。每个任务都需要一定数量的工作人员,我现在执行的方式是遍历任务 df 并在每一行停止,然后检查工作人员 df 并继续分配工作人员,直到任务足够。然后我继续执行下一个任务,依此类推。我还一一检查了工人,并根据外部函数决定是否分配工人,该外部函数给出 1 进行分配或 0 0 进行传递。

我不确定我处理这个问题的方式是否正确,或者我是否应该以不同的方式来做。如果您有关于根据外部职能的决定为每项任务分配所需工作人员数量的更清晰方法的建议,请告诉我。

任务 df 看起来像这样:

task_id day shift   workers_needed
0   1   4   1   3
1   2   4   2   5
2   3   7   1   4
3   4   5   2   4

工人 df 看起来像这样:

    worker_id   name
0   101 Worker_101
1   102 Worker_102
2   103 Worker_103
3   104 Worker_104

我当前的方法在下面的代码中:

你可以看到 while 循环在 i len(tasks_df)-1 中进行。我尝试了几个选项来更改 while 循环的条件,但它要么通过将第一个条件设置为 -1 来错过最后一行,要么如果删除第二个条件,它会多一行。

    i = 0

cur_task = tasks_df.iloc[i]['task_id']
needed_workers = tasks_df.iloc[i]['workers_needed']
print(f"Current Task is = {cur_task}")
print(f"needed workers = {needed_workers}")

while i < len(tasks_df):
  # print(f" i = {i}")
  random_int = random.randint(0, 1)
  print(f"random_int = {random_int}")
  if(random_int==1):
    needed_workers-= 1
    print(f"updated needed workers = {needed_workers}")
    if needed_workers==0:
      i+=1
      if i>len(tasks_df)-1:
        break
      cur_task = tasks_df.iloc[i]['task_id']
      needed_workers = tasks_df.iloc[i]['workers_needed']
      print(f"Current Task is = {cur_task} ----------------")
      print(f"needed workers = {needed_workers}")

 

我现在正在决定使用给出 1 或 0 的随机变量进行分配。现在,决定本身并不重要,重要的是通过 dfs 并使用该决定将所需的工作人员分配给任务的方式。

python pandas dataframe
1个回答
0
投票

您可以按以下方式使用

iterows()
代替。使用
tasks_df
直接迭代
iterrows()
的行,这比手动管理循环索引更清晰、更安全。模拟决策过程并分配工作人员,直到满足任务要求或没有更多可用工作人员为止。我完全基于我可以从您提供的代码中读取的逻辑,所以除非它是错误的,否则这应该会产生您想要的结果。

import pandas as pd
import random

tasks_data = {
    'task_id': [1, 2, 3, 4],
    'day': [4, 4, 7, 5],
    'shift': [1, 2, 1, 2],
    'workers_needed': [3, 5, 4, 4]
}
workers_data = {
    'worker_id': [101, 102, 103, 104],
    'name': ['Worker_101', 'Worker_102', 'Worker_103', 'Worker_104']
}

tasks_df = pd.DataFrame(tasks_data)
workers_df = pd.DataFrame(workers_data)

available_workers = list(workers_df['worker_id'])

assignments = {task_id: [] for task_id in tasks_df['task_id']}  

for _, task in tasks_df.iterrows():
    print(f"Current Task: {task['task_id']} needs {task['workers_needed']} workers")
    
    while task['workers_needed'] > 0 and available_workers:
        if random.randint(0, 1) == 1:
            assigned_worker = available_workers.pop(0) 
            assignments[task['task_id']].append(assigned_worker)
            task['workers_needed'] -= 1
            print(f"Assigned Worker {assigned_worker}. Remaining: {task['workers_needed']}")

    if task['workers_needed'] > 0:
        print(f"Not enough workers for Task {task['task_id']}. Needed: {task['workers_needed']} more.")

print("Assignments:", assignments)

返回

Current Task: 1 needs 3 workers
Assigned Worker 101. Remaining: 2
Assigned Worker 102. Remaining: 1
Assigned Worker 103. Remaining: 0
Current Task: 2 needs 5 workers
Assigned Worker 104. Remaining: 4
Not enough workers for Task 2. Needed: 4 more.
Current Task: 3 needs 4 workers
Not enough workers for Task 3. Needed: 4 more.
Current Task: 4 needs 4 workers
Not enough workers for Task 4. Needed: 4 more.
Assignments: {1: [101, 102, 103], 2: [104], 3: [], 4: []}
© www.soinside.com 2019 - 2024. All rights reserved.