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

如何连接DataFrame并生成指定分布的人工数据集Z_prime?

问题分析与修正实现

需求说明

需要连接两个DataFrame创建人工数据集,同时生成符合要求的Z_prime:

  • 分类特征(硬编码为列索引3-7):取值来自离散均匀分布,需覆盖原特征的所有可能取值范围
  • 连续特征(硬编码为列索引0-2、8-11):取值来自连续均匀分布,范围与原特征一致
  • 基于Z_prime多次迭代计算Wks_star并返回结果

原代码存在的问题

  1. 分类特征取值范围错误:np.random.randint是左闭右开区间,原代码未包含原特征的最大值,导致生成的取值缺失上限
  2. DataFrame索引错误:遍历列时用cat[:,col]的方式不符合Pandas索引规则,会触发报错
  3. 模拟逻辑重复:所有迭代都使用同一个Z_prime,没有生成新的模拟数据集,失去多次模拟的意义
  4. 返回值类型不匹配:函数声明返回[list, list],实际返回np.array,类型不一致
  5. 缺失数据集连接逻辑:原代码未体现连接两个DataFrame创建初始数据集的步骤

修正后的代码实现

import pandas as pd
import numpy as np

def _simulate_Wks(self, X1: pd.DataFrame, X2: pd.DataFrame, K: int, n_iterations: int) -> list:
    # 1. 连接两个DataFrame,创建初始人工数据集
    X = pd.concat([X1, X2], axis=1).reset_index(drop=True)
    
    # 定义分类/连续特征的列索引
    cat_cols = [3,4,5,6,7]
    cont_cols = [0,1,2,8,9,10,11]
    
    simulated_Wks = []
    
    for _ in range(n_iterations):
        # 2. 每次迭代重新生成Z_prime,避免重复使用同一数据集
        Z_prime = X.copy().values
        
        # 处理分类特征:离散均匀分布,包含原特征的最小/最大值
        for col in cat_cols:
            col_data = X.iloc[:, col]
            min_val = col_data.min()
            max_val = col_data.max()
            # randint左闭右开,high+1才能取到max_val
            Z_prime[:, col] = np.random.randint(low=min_val, high=max_val + 1, size=len(X))
        
        # 处理连续特征:连续均匀分布
        for col in cont_cols:
            col_data = X.iloc[:, col]
            min_val = col_data.min()
            max_val = col_data.max()
            Z_prime[:, col] = np.random.uniform(low=min_val, high=max_val, size=len(X))
        
        # 3. 计算当前迭代的Wks_star并保存
        Wks_star = self._calculate_Wks(K=K, X=Z_prime)
        simulated_Wks.append(Wks_star)
    
    # 转换为列表返回,匹配函数声明的返回类型
    return np.array(simulated_Wks).tolist()

关键修正点说明

  • 新增pd.concat逻辑,完成两个DataFrame的连接,生成初始人工数据集
  • 修正randint的high参数为max_val + 1,确保分类特征能取到原数据的最大值
  • 用X.iloc[:, col]正确获取指定列的数据,避免索引错误
  • 将Z_prime的生成逻辑放入迭代循环,每次模拟都生成全新的数据集
  • 调整返回值为列表,与函数声明的返回类型一致(若需要numpy数组,可去掉.tolist())

内容的提问来源于stack exchange,提问作者Sean_TBI_Research

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:45:20