You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas按分组生成时间戳排序的指定最大长度序列

解决方案

实现思路

  1. 先对原始数据按分组列+时间戳升序排序,保证每个分组内的日志按时间顺序排列
  2. 对每个分组内的日志序列生成滑动窗口:序列长度小于等于max_len时直接返回完整序列;长度超出时按步长1生成所有长度为max_len的连续子序列
  3. 展开分组结果后格式化输出为目标结构

完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:06:00