如何对DataFrame数值列元素随机重排并生成多组样本
实现方案
你可以用Pandas搭配NumPy完成需求,代码会自动识别所有数值列,哪怕有上百列也不需要手动指定列名,适配性强。
完整可运行代码
import pandas as pd import numpy as np # ---------------------- 1. 构造原始数据(你已有df可跳过这步) ---------------------- raw_data = { 'Name': ['John'], 'A': [1], 'B': [2], 'C': [3], 'D': [2], 'E': [3] } df = pd.DataFrame(raw_data) # ---------------------- 2. 核心逻辑 ---------------------- # 自定义生成的行数 GENERATE_ROWS = 50 # 固定列配置,若有多个固定列可改为列表,如 ['Name', 'Department'] FIXED_COLS = ['Name'] fixed_values = df[FIXED_COLS].iloc[0] # 自动筛选所有需要打乱的数值列 shuffle_cols = [col for col in df.columns if col not in FIXED_COLS] # 提取原始待打乱的数值序列 raw_nums = df[shuffle_cols].iloc[0].values # 批量生成随机重排结果 shuffled_results = [] for _ in range(GENERATE_ROWS): # 对原始数值做无放回随机重排,完全保留原始数值的频次分布 shuffled_line = np.random.permutation(raw_nums) shuffled_results.append(shuffled_line) # 拼接为最终DataFrame result_df = pd.DataFrame(shuffled_results, columns=shuffle_cols) # 批量插入固定列 for col in FIXED_COLS: result_df.insert(0, col, fixed_values[col]) # 输出验证 print(result_df.head())
扩展说明
- 若原始数据有多个不同Name的行,需要为每个Name单独生成重排结果,只需要对原始DataFrame按固定列分组后,循环每组执行上述核心逻辑即可
- 代码默认保留原始数值的频次分布,比如原始数值是2个2、2个3、1个1,重排后的每一行也会严格遵循这个数量比例,和你给出的示例要求完全一致
内容的提问来源于stack exchange,提问作者Hoang Ha
相关产品推荐
相关产品推荐

