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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:21:47