如何连接DataFrame并生成指定分布的人工数据集Z_prime?
问题分析与修正实现
需求说明
需要连接两个DataFrame创建人工数据集,同时生成符合要求的Z_prime:
- 分类特征(硬编码为列索引3-7):取值来自离散均匀分布,需覆盖原特征的所有可能取值范围
- 连续特征(硬编码为列索引0-2、8-11):取值来自连续均匀分布,范围与原特征一致
- 基于
Z_prime多次迭代计算Wks_star并返回结果
原代码存在的问题
- 分类特征取值范围错误:
np.random.randint是左闭右开区间,原代码未包含原特征的最大值,导致生成的取值缺失上限 - DataFrame索引错误:遍历列时用
cat[:,col]的方式不符合Pandas索引规则,会触发报错 - 模拟逻辑重复:所有迭代都使用同一个
Z_prime,没有生成新的模拟数据集,失去多次模拟的意义 - 返回值类型不匹配:函数声明返回
[list, list],实际返回np.array,类型不一致 - 缺失数据集连接逻辑:原代码未体现连接两个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
相关产品推荐
相关产品推荐

