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

如何将含连续二进制列的DataFrame拆分为类别对应的DataFrame列表?

处理大型DataFrame的高效拆分方案

核心思路是先给连续相同的cat值生成唯一分组标识,再利用pandas的groupby进行批量拆分——这是处理大型数据的最优方式,因为groupby基于向量化操作,避免了低效的逐行循环。

具体步骤:

  1. 生成连续分组标识:
    通过比较当前行cat值与上一行是否不同,生成累加的分组键。这个操作是向量化的,速度极快:

    df['group_id'] = df['cat'].ne(df['cat'].shift()).cumsum()
    

    原理:ne()判断当前值和前一行是否不等,返回布尔序列;cumsum()将布尔值转为0/1累加,相同连续值会得到同一个group_id。

  2. 按分组标识拆分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:35:28