如何拆分含邮箱地址的总表 满足单校条数限制与分表去重要求
3700行数据表拆分实现方案
前置校验(必须先完成,否则拆分可能失败)
- 先对总表做邮箱去重,删除重复邮箱的冗余行,确保总表内所有邮箱唯一,从源头避免跨表重复问题
- 按学校维度统计行数,确认所有学校的总行数≤100(25条/表 * 4张表),如果有学校超过100条,需求本身不可实现,需要先调整约束
具体拆分步骤
- 预处理分块
把每个学校的所有行拆分为最多25条的独立数据块,比如某学校共62条数据,就拆为2个25条块+1个12条块,每个数据块只能放入同一张子表,避免单校在单表内超量。 - 子表填充
- 初始化4个空数据表,前3张设置1000行的容量上限,第4张无上限
- 遍历所有学校数据块,优先往未达容量上限的前3张子表投放,投放前只需确认当前子表内该学校没有已存入的数据(因为块本身≤25条,所以只要没放过同校数据,就不会触发上限)
- 前3张表都满1000行后,剩余所有数据块直接存入第4张表
- 结果校验
- 分别统计每张子表的各学校行数,确认没有超过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
相关产品推荐
相关产品推荐

