Python中如何用Pandas/Numpy按连续相同标签行块生成数组列表
连续同标签行块拆分的实现方案
核心问题
之前按标签值聚合的思路,是把所有标签值相同的行(无论是否相邻)整合到一起,完全忽略连续相同标签的拆分要求,因此只能得到和标签类别数一致的结果,无法匹配需求。
正确的拆分逻辑非常直接:
- 定位标签序列中所有发生值变化的位置,这些位置就是新连续块的起始点
- 给每个连续块分配独立的分组标识,按标识切分对应行数据为独立数组
Pandas 实现
适配日常DataFrame操作流程,代码可读性高:
import pandas as pd import numpy as np # 假设原始数据集为df,标签列列名为label # 1. 逐行对比当前行与上一行的标签,标记所有标签发生变化的位置 label_change_flag = df['label'].ne(df['label'].shift()) # 2. 对变化标记做累计求和,得到每行所属连续块的ID block_identifier = label_change_flag.cumsum() # 3. 按块ID分组,提取每个块的特征数据转为数组,组成目标列表 result_block_list = [group.drop(columns=['label']).values for _, group in df.groupby(block_identifier)]
针对示例标签序列 [1,1,1,2,2,3,1,1,1,3],该方法会逐行识别变化点,最终拆分出全部连续同标签段,结果和实际段数完全一致。
Numpy 实现
运算效率更高,适合大规模数据场景,无需依赖Pandas的分组逻辑:
# 从DataFrame中提取标签数组和全特征矩阵 label_array = df['label'].values feature_array = df.drop(columns=['label']).values # 1. 错位对比标签序列,找出所有标签值发生变化的行位置 change_line_pos = np.flatnonzero(label_array[1:] != label_array[:-1]) # 2. 构造数组切分需要的边界索引,补全数据开头和结尾的位置 split_boundaries = np.concatenate([[0], change_line_pos + 1, [len(label_array)]]) # 3. 按边界直接切分特征矩阵,生成块数组列表 result_block_list = [ feature_array[split_boundaries[i]:split_boundaries[i+1]] for i in range(len(split_boundaries) - 1) ]
该版本全程使用numpy原生数组操作,没有冗余的索引匹配、分组排序开销,对10000条规模的数据集可以实现毫秒级运算。
内容的提问来源于stack exchange,提问作者GK89
相关产品推荐
相关产品推荐

