如何按列值切割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
相关产品推荐
相关产品推荐

