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

如何修复生成指定方差DataFrame时单列值重复的问题

修正Python代码以生成单列值唯一的DataFrame

问题背景

需要基于现有DataFrame生成多个新DataFrame,要求:

  • 每个新DataFrame为100行118列
  • 新DataFrame与输入DataFrame的方差保持在±20%范围内
  • 同一列内的值必须唯一(跨列可重复)
    原代码生成的DataFrame存在单列内部值重复的问题,需修正。

原代码问题分析

  1. 使用np.random.normal生成正态分布数据,本身存在重复值概率,且未做唯一性校验
  2. 在列循环内固定np.random.seed(1),导致每列生成的随机序列重复风险高,且每日生成的数据也会重复
  3. 没有针对单列唯一性的处理逻辑

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:37:20