如何基于Pandas DataFrame中连续特征序列实现分组?
可行,以下是两种实用实现思路
思路1:基于已知key序列的滑动窗口匹配
适合无需完全依赖last_in_block标记的场景,直接通过匹配key特征序列定位数据块:
- 准备目标序列并生成滑动窗口匹配
import pandas as pd import numpy as np # 你的已知key特征序列 target_seq = [2, 4, 1, 6, 3, 3, 3, 5] seq_length = len(target_seq) # 生成key列的滑动窗口,窗口长度与目标序列一致 key_windows = np.lib.stride_tricks.sliding_window_view(df['key'].values, seq_length) # 筛选出所有完全匹配目标序列的起始索引 match_starts = np.where((key_windows == target_seq).all(axis=1))[0]
- 为匹配块分配分组ID
# 初始化分组ID列 df['group_id'] = np.nan # 给每个匹配块分配连续的分组ID for group_num, start_idx in enumerate(match_starts): end_idx = start_idx + seq_length - 1 df.loc[start_idx:end_idx, 'group_id'] = group_num # 给未匹配的行标记(可选) df['group_id'] = df['group_id'].fillna('unmatched')
- 执行分组操作
# 按group_id分组,保留未匹配组 grouped = df.groupby('group_id', dropna=False) # 示例:生成每个组的统计摘要 group_summary = grouped.agg( earliest_time=('timestamp', 'min'), latest_time=('timestamp', 'max'), avg_value=('value', 'mean') )
思路2:结合last_in_block标记+序列验证
优先利用已有的块结束标记分割数据,再验证每个块的key序列,适合大型DataFrame(性能更优):
- 通过
last_in_block定位所有块的起止位置
# 获取所有块结束行的索引 block_end_indices = df[df['last_in_block']].index.tolist() # 计算对应块的起始索引:第一个块从0开始,后续块以上一个块结束的下一行起始 block_start_indices = [0] + [idx + 1 for idx in block_end_indices[:-1]]
- 验证块序列并分配分组ID
df['group_id'] = 'invalid' valid_group_num = 0 for start, end in zip(block_start_indices, block_end_indices): # 提取当前块的key序列 current_block_keys = df.loc[start:end, 'key'].tolist() # 验证是否匹配目标序列 if current_block_keys == target_seq: df.loc[start:end, 'group_id'] = valid_group_num valid_group_num += 1
- 执行分组操作
grouped = df.groupby('group_id') # 示例:筛选有效块并聚合 valid_blocks = grouped.get_group('invalid').drop() # 排除无效块 valid_block_summary = valid_blocks.agg(...)
例外情况处理
对于少数序列不完整的异常块:
- 可标记为
invalid后单独处理 - 若允许部分匹配,可调整逻辑(比如用相似度阈值替代完全匹配)
内容的提问来源于stack exchange,提问作者WolfiG
相关产品推荐
相关产品推荐

