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

如何基于外部条件为DataFrame补充缺失的槽位行?

问题描述

原始DataFrame数据如下:

Env location lob      grid row server        model        make          slot
Prod USA     Market   AB3 bc2  Server123     Hitachi        dcs           1
Prod USA     Market   AB3 bc2  Server123     Hitachi        dcs           2
Prod USA     Market   AB3 bc2  Server123     Hitachi        dcs           3
Prod USA     Market   AB3 bc2  Server123     Hitachi       dcs           4
Dev  EMEA    Ins     AB6 bc4  Serverabc     IBM            abc           3
Dev  EMEA    Ins     AB6 bc4  Serverabc     IBM            abc          3
Dev  EMEA    Ins     AB6 bc4  Serverabc     IBM            abc           3
Dev  EMEA    Ins     AB6 bc4  Serverabc     IBM            abc           4
Dev  EMEA    Ins     AB6 bc4  Serverabc     IBM            abc           5
Dev  EMEA    Ins     AB6 bc4  Serverabc     IBM            abc           5
Dev  EMEA    Ins     AB6 bc4  Serverabc     IBM            abc           6
UAT  PAC     Retail   AB6 bc4  Serverzzz     Cisco          ust           3
UAT  PAC     Retail   BB6 bc4  Serverzzz     Cisco          ust           4
UAT  PAC     Retail   BB6 bc4  Serverzzz     Cisco          ust           5
UAT  PAC     Retail   BB6 bc4  Serverzzz     Cisco          ust           6

需求规则:

  • IBM:需包含8个槽位,起始槽位为3,覆盖范围3-10,当前仅存在3-6,需补充槽位7、8、9、10的行
  • Cisco:需包含6个槽位,当前仅存在3-6,需补充槽位7、8的行
  • 新增行需重复对应model最后一行的信息,仅递增slot数值,且grid字段设为available

用户尝试的代码片段:

def slots(row):
   if 'IBM' in row['model']:
      number_row=8
   if 'Cisco' in row['model']:
      number_row=6
完整解决方案代码
import pandas as pd

# 加载原始数据
data = [
    ["Prod", "USA", "Market", "AB3", "bc2", "Server123", "Hitachi", "dcs", 1],
    ["Prod", "USA", "Market", "AB3", "bc2", "Server123", "Hitachi", "dcs", 2],
    ["Prod", "USA", "Market", "AB3", "bc2", "Server123", "Hitachi", "dcs", 3],
    ["Prod", "USA", "Market", "AB3", "bc2", "Server123", "Hitachi", "dcs", 4],
    ["Dev", "EMEA", "Ins", "AB6", "bc4", "Serverabc", "IBM", "abc", 3],
    ["Dev", "EMEA", "Ins", "AB6", "bc4", "Serverabc", "IBM", "abc", 3],
    ["Dev", "EMEA", "Ins", "AB6", "bc4", "Serverabc", "IBM", "abc", 3],
    ["Dev", "EMEA", "Ins", "AB6", "bc4", "Serverabc", "IBM", "abc", 4],
    ["Dev", "EMEA", "Ins", "AB6", "bc4", "Serverabc", "IBM", "abc", 5],
    ["Dev", "EMEA", "Ins", "AB6", "bc4", "Serverabc", "IBM", "abc", 5],
    ["Dev", "EMEA", "Ins", "AB6", "bc4", "Serverabc", "IBM", "abc", 6],
    ["UAT", "PAC", "Retail", "AB6", "bc4", "Serverzzz", "Cisco", "ust", 3],
    ["UAT", "PAC", "Retail", "BB6", "bc4", "Serverzzz", "Cisco", "ust", 4],
    ["UAT", "PAC", "Retail", "BB6", "bc4", "Serverzzz", "Cisco", "ust", 5],
    ["UAT", "PAC", "Retail", "BB6", "bc4", "Serverzzz", "Cisco", "ust", 6],
]

df = pd.DataFrame(data, columns=["Env", "location", "lob", "grid", "row", "server", "model", "make", "slot"])

# 定义各model的槽位总数要求
slot_rules = {
    "IBM": 8,
    "Cisco": 6
}

processed_groups = []
# 按model分组处理
for model, group in df.groupby("model"):
    # 提取唯一slot并排序
    existing_slots = sorted(group["slot"].unique())
    
    # 无规则要求的model直接保留原数据
    if model not in slot_rules:
        processed_groups.append(group)
        continue
    
    total_slots = slot_rules[model]
    start_slot = existing_slots[0]
    # 计算需要覆盖的所有slot范围
    required_slots = range(start_slot, start_slot + total_slots)
    
    # 找出缺失的slot
    missing_slots = [s for s in required_slots if s not in existing_slots]
    
    if not missing_slots:
        processed_groups.append(group)
        continue
    
    # 生成新行的模板(取分组最后一行)
    template = group.iloc[-1].copy()
    template["grid"] = "available"
    
    # 生成缺失的行
    new_rows = []
    for slot_num in missing_slots:
        new_row = template.copy()
        new_row["slot"] = slot_num
        new_rows.append(new_row)
    
    # 合并原数据与新行,按slot排序
    updated_group = pd.concat([group, pd.DataFrame(new_rows)], ignore_index=True)
    updated_group = updated_group.sort_values("slot").reset_index(drop=True)
    processed_groups.append(updated_group)

# 合并所有分组,恢复原始的环境排序
final_df = pd.concat(processed_groups, ignore_index=True)
final_df = final_df.sort_values(by=["Env", "location"], ignore_index=True)

# 输出结果
print(final_df.to_string(index=False))
代码逻辑说明
  1. 数据加载:将原始数据转换为pandas DataFrame,便于结构化处理。
  2. 规则定义:用字典存储不同model的槽位总数要求,后续可直接扩展其他model规则。
  3. 分组处理:
    • 按model分组后,提取当前分组已有的唯一slot并排序,确定起始槽位。
    • 计算该model需要覆盖的完整slot范围,对比现有slot找出缺失值。
    • 基于分组最后一行生成新行模板,修改grid为available,并依次填充缺失的slot值。
  4. 结果合并:将处理后的所有分组合并,按原始数据的Env和location排序,得到符合要求的最终DataFrame。

内容的提问来源于stack exchange,提问作者user1471980

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:47:41