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

如何拆分含邮箱地址的总表 满足单校条数限制与分表去重要求

3700行数据表拆分实现方案

前置校验(必须先完成,否则拆分可能失败)

  • 先对总表做邮箱去重,删除重复邮箱的冗余行,确保总表内所有邮箱唯一,从源头避免跨表重复问题
  • 按学校维度统计行数,确认所有学校的总行数≤100(25条/表 * 4张表),如果有学校超过100条,需求本身不可实现,需要先调整约束

具体拆分步骤

  1. 预处理分块
    把每个学校的所有行拆分为最多25条的独立数据块,比如某学校共62条数据,就拆为2个25条块+1个12条块,每个数据块只能放入同一张子表,避免单校在单表内超量。
  2. 子表填充
  • 初始化4个空数据表,前3张设置1000行的容量上限,第4张无上限
  • 遍历所有学校数据块,优先往未达容量上限的前3张子表投放,投放前只需确认当前子表内该学校没有已存入的数据(因为块本身≤25条,所以只要没放过同校数据,就不会触发上限)
  • 前3张表都满1000行后,剩余所有数据块直接存入第4张表
  1. 结果校验
  • 分别统计每张子表的各学校行数,确认没有超过25条的情况
  • 合并4张子表的邮箱列做去重校验,确认去重后总数等于总表去重后的邮箱总数,无跨表重复

Python 实现参考(基于Pandas)

import pandas as pd

# 读取总表
total_df = pd.read_excel("总表.xlsx")
# 邮箱去重
total_df = total_df.drop_duplicates(subset="邮箱地址", keep="first")
# 校验学校总容量
school_count = total_df["学校"].value_counts()
assert school_count.max() <= 100, "存在学校总数据量超过100,无法满足单表单校≤25的约束"

# 按学校拆分为≤25条的块
school_blocks = []
for school, group in total_df.groupby("学校"):
    group_list = [group.iloc[i:i+25] for i in range(0, len(group), 25)]
    school_blocks.extend(group_list)

# 初始化子表
sub_tables = [[], [], [], []]
capacities = [1000, 1000, 1000, float("inf")]
# 记录每个子表已有的学校,避免重复放同校块
table_schools = [set(), set(), set(), set()]

for block in school_blocks:
    school = block["学校"].iloc[0]
    block_len = len(block)
    # 优先放前3个未满的表
    for i in range(4):
        if len(sub_tables[i]) + block_len <= capacities[i] and school not in table_schools[i]:
            sub_tables[i].append(block)
            table_schools[i].add(school)
            break

# 转换为DataFrame并导出
for idx, table in enumerate(sub_tables):
    df = pd.concat(table)
    df.to_excel(f"子表{idx+1}.xlsx", index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:24:09