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

如何按列值切割Pandas DataFrame,提取连续A行生成多个子DataFrame?

问题描述

给定如下Pandas DataFrame:

0 | A
1 | B
2 | A
3 | A
4 | B
5 | A
6 | B
7 | B
8 | A
9 | A

需要以B值为分隔,将原DataFrame切割为多个子DataFrame,剔除所有B行,把连续的A行分别作为独立的结果DataFrame,最终得到如下4个子DataFrame:
df#1:

0 | A

df#2:

2 | A
3 | A

df#3:

5 | A

df#4:

8 | A
9 | A

要求必须保留A行的原有顺序,实际应用场景为时间序列事件处理,需要将被无关事件(B)分隔的相关事件(A)作为单个事件组处理。

解决方案

可以通过标记连续A行的分组,再按分组拆分的方式实现,具体代码如下:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({'value': ['A', 'B', 'A', 'A', 'B', 'A', 'B', 'B', 'A', 'A']}, index=[0,1,2,3,4,5,6,7,8,9])

# 标记所有A行的位置
mask = df['value'] == 'A'
# 为每组连续的A行生成唯一分组编号
groups = mask.cumsum() - mask.cumsum().where(~mask).ffill().fillna(0).astype(int)
# 筛选A行并添加分组列
df_a = df[mask].assign(group=groups[mask])

# 按分组拆分得到子DataFrame列表
sub_dfs = [group_df.drop('group', axis=1) for _, group_df in df_a.groupby('group')]

# 输出验证结果
for i, sub_df in enumerate(sub_dfs, 1):
    print(f'df#{i}:')
    print(sub_df)
    print('---')

代码说明

  • mask = df['value'] == 'A':生成布尔序列,定位所有A行
  • groups = ...:核心逻辑,通过累计求和结合向前填充,为每一段连续的A行分配唯一分组ID,实现对被B分隔的A行的分组
  • df_a = df[mask].assign(group=groups[mask]):筛选出所有A行并绑定分组标识
  • 最后通过groupby拆分数据,移除分组列后得到符合要求的子DataFrame列表,完全保留原行顺序与索引

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:48:20