如何将含连续二进制列的DataFrame拆分为类别对应的DataFrame列表?
处理大型DataFrame的高效拆分方案
核心思路是先给连续相同的cat值生成唯一分组标识,再利用pandas的groupby进行批量拆分——这是处理大型数据的最优方式,因为groupby基于向量化操作,避免了低效的逐行循环。
具体步骤:
生成连续分组标识:
通过比较当前行cat值与上一行是否不同,生成累加的分组键。这个操作是向量化的,速度极快:df['group_id'] = df['cat'].ne(df['cat'].shift()).cumsum()原理:
ne()判断当前值和前一行是否不等,返回布尔序列;cumsum()将布尔值转为0/1累加,相同连续值会得到同一个group_id。按分组标识拆分DataFrame:
用groupby按group_id分组,再将分组结果转为DataFrame列表:df_list = [group for _, group in df.groupby('group_id')]如果不需要保留
group_id列,可以在分组后删除:df_list = [group.drop('group_id', axis=1) for _, group in df.groupby('group_id')]
完整示例代码:
import pandas as pd import numpy as np import random # 生成示例数据 idx = [i for i in range(55)] cat = [0]*11 + [1]*10 + [0]*13 + [1]*10 + [0]*11 y = [random.random()*10 for _ in range(55)] df = pd.DataFrame({'idx':idx, 'cat':cat, 'y':y}) # 生成分组键并拆分 df['group_id'] = df['cat'].ne(df['cat'].shift()).cumsum() df_list = [group.drop('group_id', axis=1) for _, group in df.groupby('group_id')] # 验证结果:列表长度应为5,对应5个连续类别 print(len(df_list)) # 输出:5
为什么这是最优方案?
- 向量化操作:整个分组过程依赖pandas内部优化的C语言实现,比Python层面的循环快几个数量级,完全适配百万级以上行的大型DataFrame。
- 内存高效:
groupby不会提前复制所有数据,而是按需生成子DataFrame,内存占用更低。
内容的提问来源于stack exchange,提问作者Bas R
相关产品推荐
相关产品推荐

