如何基于外部条件为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))
代码逻辑说明
- 数据加载:将原始数据转换为pandas DataFrame,便于结构化处理。
- 规则定义:用字典存储不同model的槽位总数要求,后续可直接扩展其他model规则。
- 分组处理:
- 按
model分组后,提取当前分组已有的唯一slot并排序,确定起始槽位。 - 计算该model需要覆盖的完整slot范围,对比现有slot找出缺失值。
- 基于分组最后一行生成新行模板,修改
grid为available,并依次填充缺失的slot值。
- 按
- 结果合并:将处理后的所有分组合并,按原始数据的
Env和location排序,得到符合要求的最终DataFrame。
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

