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

如何高效自动拆分Pandas DataFrame为无重复ID的n个分块?

解决Pandas DataFrame按ID无重复拆分的问题

np.array_split直接按行均分的方式会破坏同ID的完整性,要满足「同ID不跨块」的要求,核心是先对唯一ID进行分组,再映射回原DataFrame提取对应行。

基础实现方案

先提取所有不重复的ID,将这些ID拆分为4组,再根据每组ID筛选原DataFrame的行:

import pandas as pd
import numpy as np

# 构造示例DataFrame
data = {'ID': [1,1,1,20,20,30,50,50,51,60,60,300,300,302,302,500]}
df = pd.DataFrame(data)

# 提取唯一ID并拆分为4组
unique_ids = df['ID'].unique()
id_groups = np.array_split(unique_ids, 4)

# 生成拆分后的DataFrame列表
df_splits = [df[df['ID'].isin(group)] for group in id_groups]

# 验证结果(可选)
for idx, split_df in enumerate(df_splits, 1):
    print(f"分块{idx}包含的ID:{split_df['ID'].unique()}")
    print(f"分块{idx}的行数:{len(split_df)}\n")

均衡优化方案

如果希望各分块的行数尽量接近(避免某块过大/过小),可以先按ID的出现次数排序,再轮流分配ID到不同组:

# 按ID出现次数从多到少排序
id_counts = df['ID'].value_counts().sort_values(ascending=False)
sorted_ids = id_counts.index.tolist()

# 轮流分配ID到4个组,平衡各块行数
id_groups_balanced = [[], [], [], []]
for idx, id_val in enumerate(sorted_ids):
    id_groups_balanced[idx % 4].append(id_val)

# 生成均衡拆分后的DataFrame列表
df_splits_balanced = [df[df['ID'].isin(group)] for group in id_groups_balanced]

# 验证均衡结果(可选)
for idx, split_df in enumerate(df_splits_balanced, 1):
    print(f"均衡分块{idx}包含的ID:{split_df['ID'].unique()}")
    print(f"均衡分块{idx}的行数:{len(split_df)}\n")

两种方案都能保证同ID的所有行只出现在一个分块中,基础方案实现简单,均衡方案能让各分块的行数更接近。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:18:25