Pandas DataFrame无需排序遍历按连续分类值拆分的实现方法
实现方案
你可以通过生成连续分组标识的方式实现需求,完全基于Pandas向量化运算,性能远高于手动遍历,适配数万条数据毫无压力,具体实现如下:
import pandas as pd def split_consecutive_groups(df: pd.DataFrame, group_col: str) -> list[pd.DataFrame]: # 生成连续分组ID:当前行与上一行分组列值不同时,分组ID累加1 group_id = (df[group_col] != df[group_col].shift()).cumsum() # 按分组ID拆分,返回所有分组的DataFrame列表 return [group for _, group in df.groupby(group_id, sort=False)]
调用示例
假设你的原始DataFrame命名为df,按type列拆分连续块的调用方式:
group_list = split_consecutive_groups(df, group_col='type')
返回的group_list就是你需要的拆分后的切片列表,顺序和原始数据完全一致,每个元素对应一个连续同值块。
实现原理
- 用
df[group_col].shift()将分组列向上偏移一行,和当前行比较,生成布尔序列,值不同时为True(即新分组的起始行) - 对布尔序列执行
cumsum()累加,连续相同值的行会得到同一个累加值,也就是分组ID - 按分组ID执行
groupby,参数sort=False保证分组顺序和原始数据顺序完全一致,不会按分组值排序打乱顺序
性能说明
该实现全程使用Pandas内置的向量化运算,没有Python层的循环,处理10万行以内的数据耗时在毫秒级,完全满足你的性能要求。
内容的提问来源于stack exchange,提问作者TriGiamp
相关产品推荐
相关产品推荐

