当前位置: 代码网 > it编程>前端脚本>Python > Python一键搞定Excel数据自动分配

Python一键搞定Excel数据自动分配

2025年10月21日 Python 我要评论
做库存管理、生鲜分拣时,你是不是也遇到过这些麻烦?—— 手里有几十行水果总数数据,要按 “每箱最多 24 个、最多分 6 箱” 的规则分配,手动算不仅慢

做库存管理、生鲜分拣时,你是不是也遇到过这些麻烦?—— 手里有几十行水果总数数据,要按 “每箱最多 24 个、最多分 6 箱” 的规则分配,手动算不仅慢,还容易漏算余数、填错单元格。

今天分享一段 python 代码,3 步完成 excel 水果分箱,自动处理空值、覆盖旧列,新手也能直接用!

一、场景痛点:手动分箱的 3 个坑

假设你有这样一份 excel 表(“水果分箱.xlsx”):

水果总数箱 1箱 2箱 3箱 4箱 5箱 6
32
130
77
124
117
20

要按规则分箱(每箱≤24 个,最多 6 箱),手动算会遇到:

  • 余数难处理:50 个苹果,24×2=48,剩 2 个,得手动补 1 箱(共 3 箱:24,24,2);
  • 空值易出错:橙子总数为空,手动可能填错成 0 或漏填;
  • 批量效率低:100 行数据要算 100 次,改规则(如每箱 20 个)又得重算。

而 python 代码能自动解决这些问题,全程不用手动计算!

二、代码拆解:5 分钟看懂分箱逻辑

这段代码核心是 “读取 excel→按规则分箱→写回 excel”,共 7 步,每步都有明确目的,我们逐行拆解:

1. 导入工具库

import pandas as pd  # 处理excel数据的“神器”
import math          # 用于计算箱子数量(向上取整)

→ 只需这两个库,安装命令:pip install pandas openpyxl(openpyxl 是读取 excel 的依赖)。

2. 读取 excel 数据

df = pd.read_excel('水果分箱.xlsx')

→ 把 excel 文件读成 “数据表格”(dataframe),后续所有操作都在这个表格上进行。

3. 分箱规则参数化(关键!方便修改)

max_per_box = 24   # 每箱最多装24个(想改20个?直接改这个数)
max_boxes = 6      # 最多分6箱(要分8箱?改这里就行)

→ 所有规则集中在这里,不用改核心代码,新手也能灵活调整。

4. 核心分箱函数(代码的 “大脑”)

def split_into_boxes(total, max_per_box=24, max_boxes=6):
    # 1. 处理空值:如果“水果总数”是空的,返回6个0(对应6箱)
    if pd.isna(total):
        return [0] * max_boxes
    # 2. 确保总数是整数(避免excel里的小数问题)
    total = int(total)
    # 3. 计算需要多少箱子:总数÷每箱数,向上取整(比如50÷24=2.08→需3箱)
    num_boxes = math.ceil(total / max_per_box)
    # 4. 限制最多6箱:即使需要7箱,也只分6箱(符合规则)
    num_boxes = min(num_boxes, max_boxes)
    # 5. 分配数量:先算每箱基础数,余数分给前几箱(避免某箱数量超标)
    base = total // num_boxes  # 基础数量(如50÷3=16)
    remainder = total % num_boxes  # 余数(50%3=2)
    # 前2箱分16+1=17个,第3箱分16个,后面补0到6箱
    boxes = [base + 1 if i < remainder else base for i in range(num_boxes)]
    boxes += [0] * (max_boxes - num_boxes)
    return boxes

举个例子:50 个苹果代入函数:

  • num_boxes=math.ceil (50/24)=3(需 3 箱)
  • base=50//3=16,remainder=50%3=2
  • boxes=[17,17,16,0,0,0](前 2 箱 17 个,第 3 箱 16 个,后 3 箱 0)

完美符合 “每箱≤24、最多 6 箱” 的规则!

5. 批量计算所有水果的分箱结果

# 对“水果总数”列的每一行,都执行分箱函数
result = df['水果总数'].apply(split_into_boxes)
# 把结果转成新表格,列名是“箱 1”到“箱 6”
boxes_df = pd.dataframe(result.tolist(), columns=[f'箱 {i}' for i in range(1, max_boxes + 1)])

→ 不管 excel 有多少行数据,1 行代码就能批量处理,比手动快 10 倍!

6. 写回原表格 + 保存文件

# 把分箱结果列(箱1-箱6)写入原excel表,已有这些列就覆盖(避免手动删空列)
for col in boxes_df.columns:
    df[col] = boxes_df[col]
# 保存为新文件,不保留索引(excel更整洁)
df.to_excel('水果分箱结果.xlsx', index=false)
print("已生成文件:水果分箱结果.xlsx ")

→ 不用手动复制粘贴,直接得到带分箱结果的 excel,打开就能用!

三、代码技术要点:3 个贴心设计

自动处理空值:遇到 “水果总数” 为空的行,自动填 6 个 0,避免漏填;

灵活修改规则:想改 “每箱 30 个、最多 8 箱”,只需改 max_per_box 和 max_boxes 两个参数;

覆盖旧列不报错:如果原 excel 已有 “箱 1” 列,会自动覆盖旧数据,不用手动删除。

四、实操小贴士:新手必看

excel 文件位置:要把 “水果分箱.xlsx” 和代码放在同一个文件夹,否则要写全文件路径(比如pd.read_excel(‘d:/工作/水果分箱.xlsx’));

处理其他数据:除了水果,商品包装、物料分配也能用,只需把 “水果总数” 改成 “商品总数”“物料总数”;

查看中间结果:想确认分箱是否正确,可在第 5 步后加print(boxes_df),运行时会显示分箱结果。

五、效果演示:输入→输出

生成的结果 excel(水果分箱结果.xlsx):

水果总数箱 1箱 2箱 3箱 4箱 5箱 6
321615
130222222222121
7720191919
124212121212020
1172424232323
2020

六、全部源代码(复制即用)

import pandas as pd
import math

# === 1. 读取 excel 数据 ===
df = pd.read_excel('水果分箱.xlsx')

# === 2. 参数设置 ===
max_per_box = 24   # 每箱最多装 24 个
max_boxes = 6      # 最多 6 箱

# === 3. 分箱计算函数 ===
def split_into_boxes(total, max_per_box=24, max_boxes=6):
    if pd.isna(total):
        return [0] * max_boxes
    total = int(total)
    num_boxes = math.ceil(total / max_per_box)
    num_boxes = min(num_boxes, max_boxes)

    base = total // num_boxes
    remainder = total % num_boxes
    boxes = [base + 1 if i < remainder else base for i in range(num_boxes)]
    boxes += [0] * (max_boxes - num_boxes)
    return boxes

# === 4. 分配结果计算 ===
result = df['水果总数'].apply(split_into_boxes)
boxes_df = pd.dataframe(result.tolist(), columns=[f'箱 {i}' for i in range(1, max_boxes + 1)])

# === 5. 写入回原表(如果已存在箱列则覆盖) ===
for col in boxes_df.columns:
    df[col] = boxes_df[col]

# === 6. 显示结果 ===
print(df)

# === 7. 保存为新文件 ===
df.to_excel('水果分箱结果.xlsx', index=false)
print(" 已生成文件:水果分箱结果.xlsx ")

如果需要调整分箱规则(比如按重量分箱),或者处理 csv 文件,都可以留言告诉我,咱们再优化代码~

到此这篇关于python一键搞定excel数据自动分配的文章就介绍到这了,更多相关python excel数据自动分配内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com