如何修复生成指定方差DataFrame时单列值重复的问题
修正Python代码以生成单列值唯一的DataFrame
问题背景
需要基于现有DataFrame生成多个新DataFrame,要求:
- 每个新DataFrame为100行118列
- 新DataFrame与输入DataFrame的方差保持在±20%范围内
- 同一列内的值必须唯一(跨列可重复)
原代码生成的DataFrame存在单列内部值重复的问题,需修正。
原代码问题分析
- 使用
np.random.normal生成正态分布数据,本身存在重复值概率,且未做唯一性校验 - 在列循环内固定
np.random.seed(1),导致每列生成的随机序列重复风险高,且每日生成的数据也会重复 - 没有针对单列唯一性的处理逻辑
修正后的代码
import numpy as np import pandas as pd from datetime import datetime def generate_data(input_df, num_days): # 计算输入DataFrame各列的均值、标准差和方差 means = input_df.mean() stds = input_df.std() vars = input_df.var() # 为每天设置不同的随机种子,避免生成重复数据 base_seed = np.random.randint(0, 10000) for day in range(num_days): output_df = pd.DataFrame(index=range(100), columns=input_df.columns) day_seed = base_seed + day for col in input_df.columns: # 设置列级随机种子,保证同一列生成的序列唯一且可复现 np.random.seed(day_seed + hash(col)) lower_bound = means[col] * (1 - 0.2) upper_bound = means[col] * (1 + 0.2) target_var = vars[col] # 生成唯一值的循环:直到生成100个不重复且符合方差要求的值 unique_data = set() while len(unique_data) < 100: # 生成基础正态分布数据 temp_data = np.random.normal(means[col], stds[col], size=200) # 裁剪到指定范围 temp_data = np.clip(temp_data, lower_bound, upper_bound) # 计算当前数据方差,若偏离目标方差±20%则调整标准差重新生成 current_var = np.var(temp_data) if abs(current_var - target_var) / target_var > 0.2: # 根据方差偏差调整标准差 adjust_factor = np.sqrt(target_var / current_var) temp_data = np.random.normal(means[col], stds[col] * adjust_factor, size=200) temp_data = np.clip(temp_data, lower_bound, upper_bound) # 将新数据加入集合自动去重 unique_data.update(temp_data) # 取前100个唯一值并转为数组 random_data = np.array(list(unique_data))[:100] # 打乱顺序避免集合排序影响随机性 np.random.shuffle(random_data) output_df[col] = random_data # 生成唯一文件名 timestamp = datetime.now().strftime("%Y%m%d%H%M%S") file_name = r"D:\pycdf\generated_data_{}_{}.csv".format(day + 1, timestamp) output_df.to_csv(file_name, index=False) print(f"Day {day + 1} 数据已保存至: {file_name}") # 假设ldf是已存在的输入DataFrame input_df = ldf.copy(deep=True) num_days = 4 generate_data(input_df, num_days)
关键修改说明
- 唯一性保证:使用
set自动去重,循环生成直到凑够100个唯一值,彻底避免单列重复 - 方差控制:增加方差校验逻辑,若生成数据的方差与输入列方差偏差超过20%,自动调整标准差重新生成,确保符合要求
- 随机种子优化:为每天、每列设置不同的随机种子,既保证生成结果可复现,又避免跨天、跨列的数据重复
- 范围裁剪:保留原有的均值上下限裁剪,确保数据分布在输入列均值的±20%范围内
- 路径优化:使用原始字符串
r""处理文件路径,避免转义字符引发的错误
内容的提问来源于stack exchange,提问作者ENAT
相关产品推荐
相关产品推荐

