如何在打乱DataFrame时保留内部序列的完整性?
保持序列完整性的DataFrame打乱方案
你说的这个需求很常见——要打乱DataFrame但不能破坏每4行一组的序列结构,直接用df.sample(frac=1)确实会把行拆得七零八落,完全不符合要求。下面是经过验证的可行方案(感谢@Wen-Ben的思路):
实现步骤
- 先定义你的序列长度:
seq_length = 4 - 预处理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) - 给每一组序列打上专属标识,把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)} - 随机打乱组的顺序,再重新拼接成最终的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
相关产品推荐
相关产品推荐

