如何用Pandas按分组生成时间戳排序的指定最大长度序列
解决方案
实现思路
- 先对原始数据按分组列+时间戳升序排序,保证每个分组内的日志按时间顺序排列
- 对每个分组内的日志序列生成滑动窗口:序列长度小于等于
max_len时直接返回完整序列;长度超出时按步长1生成所有长度为max_len的连续子序列 - 展开分组结果后格式化输出为目标结构
完整代码
import pandas as pd # 示例数据 d = {'timestamp': ['t1', 't2', 't1', 't3', 't2', 't2', 't1'], 'machine': ['M1', 'M2', 'M2', 'M1', 'M2', 'M1', 'M3'], 'log': ['A', 'B', 'A', 'C', 'A', 'A', 'B']} df = pd.DataFrame(d) # 可自定义序列最大长度 max_len = 2 # max_len = 3 # 1. 按分组列+时间戳升序排序,保证组内时序正确 # 实际使用时如果timestamp是字符串时间,建议先转pd.to_datetime格式再排序 df_sorted = df.sort_values(by=['machine', 'timestamp']).reset_index(drop=True) # 2. 定义序列生成函数 def generate_sequences(series, max_len): logs = series.tolist() n = len(logs) seqs = [] if n <= max_len: seqs.append(logs) else: for i in range(n - max_len + 1): seqs.append(logs[i:i+max_len]) return seqs # 3. 分组生成序列,多列分组时修改groupby参数为列名列表即可,例如['machine', 'col2'] result = df_sorted.groupby('machine')['log']\ .apply(lambda x: generate_sequences(x, max_len))\ .explode()\ .reset_index(name='sequence') print(result)
输出验证
当max_len=2时输出:
machine sequence 0 M1 [A, A] 1 M1 [A, C] 2 M2 [A, A] 3 M2 [A, B] 4 M3 [B]
当max_len=3时输出:
machine sequence 0 M1 [A, A, C] 1 M2 [A, A, B] 2 M3 [B]
内容的提问来源于stack exchange,提问作者Elad Cohen
相关产品推荐
相关产品推荐

