Python Pandas实现运输调度场景下按节点负载分配pcode标签
登车需求规划Pandas实现方案
核心逻辑
- 以FIFO队列维护每个节点的待登车人员,保证按顺序分配、不重复派位
- 严格按线路数据集df2的行顺序逐站处理,匹配对应节点的登车人数要求取人
- 登车人数为0时直接返回空人员编码列,人员不足时自动分配该节点剩余所有待登车人员
可运行完整代码
import pandas as pd from collections import deque # --- 测试数据构造块,实际使用时替换为本地df1、df2的读取逻辑即可 --- # 节点人员数据集 df1 = pd.DataFrame([ {"N_Id": "N001", "N_Name": "科技园站", "Geocode": "116.32,39.98", "pcode": "P001"}, {"N_Id": "N001", "N_Name": "科技园站", "Geocode": "116.32,39.98", "pcode": "P002"}, {"N_Id": "N001", "N_Name": "科技园站", "Geocode": "116.32,39.98", "pcode": "P003"}, {"N_Id": "N002", "N_Name": "软件园站", "Geocode": "116.41,39.97", "pcode": "P004"}, {"N_Id": "N002", "N_Name": "软件园站", "Geocode": "116.41,39.97", "pcode": "P005"}, ]) # 线路规划数据集 df2 = pd.DataFrame([ {"BusID": "B001", "Tcap": 45, "Terminal_Load": 2, "N_Id": "N001", "N_Name": "科技园站"}, {"BusID": "B001", "Tcap": 45, "Terminal_Load": 1, "N_Id": "N002", "N_Name": "软件园站"}, {"BusID": "B002", "Tcap": 30, "Terminal_Load": 1, "N_Id": "N001", "N_Name": "科技园站"}, {"BusID": "B002", "Tcap": 30, "Terminal_Load": 0, "N_Id": "N002", "N_Name": "软件园站"}, ]) # --- 测试数据构造块结束 --- # 1. 按节点分组初始化待分配人员队列,队列顺序和df1中pcode的存储顺序完全一致 node_queue_map = {} for n_id, group in df1.groupby("N_Id", sort=False): node_queue_map[n_id] = deque(group["pcode"].to_list()) pcode_result = [] # 2. 逐行处理经停记录,完成人员分配 for _, row in df2.iterrows(): load_count = row["Terminal_Load"] station_id = row["N_Id"] # 登车人数为0直接填空 if load_count == 0: pcode_result.append("") continue # 从对应站点队列取指定数量的人员,队列人数不足时取完剩余所有 current_queue = node_queue_map.get(station_id, deque()) selected_pcodes = [] fetch_num = min(load_count, len(current_queue)) for _ in range(fetch_num): selected_pcodes.append(current_queue.popleft()) pcode_result.append(",".join(selected_pcodes)) # 3. 拼接生成目标结果df3 df3 = df2.copy() df3["Pcode"] = pcode_result # 打印结果验证 print(df3)
注意事项
- 分组初始化队列时加了
sort=False参数,保证pcode顺序和df1原始顺序一致,如果需要按特定规则排序(比如人员报名时间),可以在分组前先对df1按对应字段排序 - 代码默认处理了站点剩余待分配人数小于登车需求的场景,不会报错,如果需要校验人数缺口,可以在取数逻辑后对比
fetch_num和load_count的值,差值即为缺口人数 - deque的
popleft()操作时间复杂度为O(1),节点人员数据量较大时运行效率远高于列表pop(0)的实现
内容的提问来源于stack exchange,提问作者vinsent paramanantham
相关产品推荐
相关产品推荐

