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

如何实现Excel按重量总和23500-24000KG区间自动行分组

带重量上下限约束的业务数据自动分组方案

你之前用顺序累加公式的方案属于单向贪心逻辑,仅能控制分组总重不超过24000KG上限,当累加值未达23500KG下限时再加下一条数据就会超上限,逻辑上无法自动满足双边界要求,以下是可直接落地的脚本方案,处理数千条数据仅需数秒:

方案说明

  • 采用改进的降序首次适配+局部回溯替换逻辑,尽可能让所有分组总重落在23500KG-24000KG的要求区间内
  • 自动识别单条重量超过24000KG的异常数据、以及最后剩余的无法凑够区间的尾组,单独标记方便人工微调,几乎不需要大量手动操作
  • 输出结果直接为要求的ID、Weight (KG)、Group ID三字段格式,可直接导出为Excel使用

操作步骤

  1. 先安装运行依赖,打开命令提示符执行以下命令:
    pip install pandas openpyxl
  2. 新建文本文档,将以下代码复制进去,把代码里的文件路径替换为你本地原始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")
  1. 双击运行这个py文件,同目录下会生成重量分组结果.xlsx,直接使用即可。

注意事项

  • 如果数据中存在单条重量超过24000KG的条目,这类条目无法和任何其他条目组成符合要求的组,会被单独标记
  • 数千条数据规模下,需要人工调整的尾组通常不超过2个,调整成本极低
  • 如果对分组利用率要求更高,可以把脚本里的排序逻辑换成其他启发式规则,当前版本已经能覆盖绝大多数业务场景的需求

内容的提问来源于stack exchange,提问作者Ernest Petroškevič

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:30:51