基于DataFrame中均值与标准差生成正态分布随机数的问题求助
问题分析与解决
你的代码存在两个核心问题:
enumerate(df)遍历的是DataFrame的列名,拿到的mean是列的索引(0-4),std是列名(1-5),完全不是你需要的均值和标准差数值。np.random.normal的size参数设为[5,1000]会生成5行1000列的数组,和你“列数与原df相同、行数更多”的需求不符。
正确实现方法
先导入numpy(你原代码遗漏了这个依赖),然后遍历每一列获取对应均值和标准差,生成指定行数的随机数,最后组合成目标DataFrame:
import pandas as pd import numpy as np # 原DataFrame df = pd.DataFrame({ 1: {'mean': 1.0, 'std': 0.8}, 2: {'mean': 0.5, 'std': 0.2}, 3: {'mean': 0.2, 'std': 0.1}, 4: {'mean': 0.1, 'std': 0.1}, 5: {'mean': 0.6, 'std': 0.2} }) # 设定要生成的行数,可根据需求修改 num_rows = 1000 full_noise_data = {} # 遍历原df的每一列 for col in df.columns: # 获取当前列的均值和标准差 mean_val = df.loc['mean', col] std_val = df.loc['std', col] # 生成对应行数的正态分布随机数 noise = np.random.normal(loc=mean_val, scale=std_val, size=num_rows) # 将数据存入字典,键为原列名 full_noise_data[col] = noise # 转换为最终的DataFrame full_noise_df = pd.DataFrame(full_noise_data)
代码说明
- 用
df.columns遍历原DataFrame的列,保证新df的列名与原数据完全一致。 - 通过
df.loc['mean', col]和df.loc['std', col]精准提取每一列的统计值。 np.random.normal的size=num_rows生成一维数组,刚好对应DataFrame的一列,行数由你自定义。
如果想简化代码,也可以用字典推导式一行完成:
full_noise_df = pd.DataFrame({ col: np.random.normal(df.loc['mean', col], df.loc['std', col], 1000) for col in df.columns })
内容的提问来源于stack exchange,提问作者mariant
相关产品推荐
相关产品推荐

