如何实现Excel按重量总和23500-24000KG区间自动行分组
带重量上下限约束的业务数据自动分组方案
你之前用顺序累加公式的方案属于单向贪心逻辑,仅能控制分组总重不超过24000KG上限,当累加值未达23500KG下限时再加下一条数据就会超上限,逻辑上无法自动满足双边界要求,以下是可直接落地的脚本方案,处理数千条数据仅需数秒:
方案说明
- 采用改进的降序首次适配+局部回溯替换逻辑,尽可能让所有分组总重落在23500KG-24000KG的要求区间内
- 自动识别单条重量超过24000KG的异常数据、以及最后剩余的无法凑够区间的尾组,单独标记方便人工微调,几乎不需要大量手动操作
- 输出结果直接为要求的
ID、Weight (KG)、Group ID三字段格式,可直接导出为Excel使用
操作步骤
- 先安装运行依赖,打开命令提示符执行以下命令:
pip install pandas openpyxl - 新建文本文档,将以下代码复制进去,把代码里的文件路径替换为你本地原始Excel文件的实际路径,保存后将后缀名改为
.py:
import pandas as pd # 分组区间配置 MIN_GROUP_WEIGHT = 23500 MAX_GROUP_WEIGHT = 24000 # 读取原始数据,替换为你的本地文件路径 raw_df = pd.read_excel("你的业务数据文件.xlsx", usecols=["ID", "Weight (KG)"]) # 按重量从大到小排序,提升分组匹配成功率 raw_df = raw_df.sort_values(by="Weight (KG)", ascending=False).reset_index(drop=True) groups = [] current_group = [] current_total = 0 for _, row in raw_df.iterrows(): weight = row["Weight (KG)"] # 单条重量超过上限的异常数据单独成组标记 if weight > MAX_GROUP_WEIGHT: groups.append([row.to_dict()]) continue # 加当前重量不超上限就加入当前组 if current_total + weight <= MAX_GROUP_WEIGHT: current_group.append(row.to_dict()) current_total += weight else: # 当前累计已达下限,直接封组开新组 if current_total >= MIN_GROUP_WEIGHT: groups.append(current_group) current_group = [row.to_dict()] current_total = weight else: # 当前累计未达下限,尝试替换组内轻量条目凑出符合区间的组 split_success = False for i in range(len(current_group)): temp_total = current_total - current_group[i]["Weight (KG)"] + weight if MIN_GROUP_WEIGHT <= temp_total <= MAX_GROUP_WEIGHT: pop_item = current_group.pop(i) current_group.append(row.to_dict()) groups.append(current_group) current_group = [pop_item] current_total = pop_item["Weight (KG)"] split_success = True break # 替换失败则暂时加入当前组,后续处理 if not split_success: current_group.append(row.to_dict()) current_total += weight # 加入最后剩余的组 if current_group: groups.append(current_group) # 整理结果格式 result_list = [] for gid, items in enumerate(groups, start=1): g_total = sum(i["Weight (KG)"] for i in items) # 不符合区间的组加标记 final_gid = gid if MIN_GROUP_WEIGHT <= g_total <= MAX_GROUP_WEIGHT else f"{gid}(需调整,当前总重{g_total}KG)" for item in items: result_list.append({ "ID": item["ID"], "Weight (KG)": item["Weight (KG)"], "Group ID": final_gid }) # 导出结果到Excel result_df = pd.DataFrame(result_list).sort_values(by="ID").reset_index(drop=True) result_df.to_excel("重量分组结果.xlsx", index=False) # 打印各组重量统计 print("分组完成,各组总重:") for gid, items in enumerate(groups, start=1): print(f"组{gid}: {sum(i['Weight (KG)'] for i in items)}KG")
- 双击运行这个py文件,同目录下会生成
重量分组结果.xlsx,直接使用即可。
注意事项
- 如果数据中存在单条重量超过24000KG的条目,这类条目无法和任何其他条目组成符合要求的组,会被单独标记
- 数千条数据规模下,需要人工调整的尾组通常不超过2个,调整成本极低
- 如果对分组利用率要求更高,可以把脚本里的排序逻辑换成其他启发式规则,当前版本已经能覆盖绝大多数业务场景的需求
内容的提问来源于stack exchange,提问作者Ernest Petroškevič
相关产品推荐
相关产品推荐

