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

如何在打乱DataFrame时保留内部序列的完整性?

保持序列完整性的DataFrame打乱方案

你说的这个需求很常见——要打乱DataFrame但不能破坏每4行一组的序列结构,直接用df.sample(frac=1)确实会把行拆得七零八落,完全不符合要求。下面是经过验证的可行方案(感谢@Wen-Ben的思路):

实现步骤

  1. 先定义你的序列长度:
    seq_length = 4
    
  2. 预处理DataFrame,确保行数是序列长度的整数倍(如果原数据行数不是4的倍数,会自动截断到最近的有效长度):
    import numpy as np
    import pandas as pd
    
    # 计算可被序列长度整除的最大有效行数
    valid_row_count = (df.shape[0] // seq_length) * seq_length
    # 截断DataFrame到有效行数
    trunc_data = df.head(valid_row_count)
    
  3. 给每一组序列打上专属标识,把DataFrame拆分成按组存储的字典:
    # 生成分组ID数组,每4行对应同一个ID
    group_ids = np.arange(valid_row_count) // seq_length
    # 按ID分组,把每组序列存入字典
    seq_groups = {idx: group for idx, group in trunc_data.groupby(group_ids)}
    
  4. 随机打乱组的顺序,再重新拼接成最终的DataFrame:
    # 生成打乱后的组索引顺序
    shuffled_indices = np.random.choice(len(seq_groups), len(seq_groups), replace=False)
    # 按打乱后的顺序拼接所有组
    shuffled_df = pd.concat([seq_groups.get(idx) for idx in shuffled_indices])
    

这样得到的shuffled_df会整体打乱序列组,但每个4行的子序列内部结构完全保留——比如原序列[1,2,3,4,10,11,12,13,20,21,22,23]会变成类似[20,21,22,23,1,2,3,4,10,11,12,13]的形式,完全匹配你的需求。

内容的提问来源于stack exchange,提问作者M.F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:17:31