You need to enable JavaScript to run this app. Python中如何用Pandas/Numpy按连续相同标签行块生成数组列表
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 15:24:04