numpy 如何使用每行的均值和标准差创建1000列随机变量

cidc1ykv  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(100)

我的dataframe看起来像这样:
| 城市|平均值|SD|
| - -----|- -----|- -----|
| 纽卡斯尔|六十|0.81|
| 利物浦|六十二|零点九一|
| 卡迪夫|六十五|0.87|
| 格拉斯哥|五十九|0.86|
我想添加列'n',其中包含使用Mean和SD列值的新随机值。我在使用之前做过这个:
df['n'] = np.random.normal(df['Mean'], df['SD'])
然后我想添加第二列,它根据'n'中的值生成五分位数排名。我使用以下命令完成了此操作:
df['q'] = pd.qcut(df['n'], 5, labels = False)
| 城市|平均值|SD| n| q| n+1| q+1|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 纽卡斯尔|六十|0.81|五十七|5个|五十五|5个|
| 利物浦|六十二|零点九一|六十一|1|五十七|4|
| 卡迪夫|六十五|0.87|六十|1|六十一|1|
| 格拉斯哥|五十九|0.86|五十五|3|五十八|3|
我想循环这两个步骤来添加2000列,1000 'n'列(名为'n+1')和1000 'q'列(名为'q+1')。

x7yiwoj4

x7yiwoj41#

使用以下方法解决了该问题:

mean = df['Mean']
std_dev = df['SD']
dist = np.random.normal(mean, std_dev)

for i in range(1000):
    col_name = 'col_' + str(i)
    df[col_name] = np.random.normal(dist)'
    
    col_name_q = 'col_q_' + str(i)
    df[col_name_q] = pd.qcut(df[col_name], 5, labels = False)
ccgok5k5

ccgok5k52#

你可以使用numpy在一次调用中创建所有的随机数。一旦将这些列添加到DataFrame中,就可以在每个新列上使用qcut并添加这些列。这不需要任何(显式)for循环。

import pandas as pd
import numpy as np

data = {"Mean":[60, 62, 65, 59],
        "STD":[0.81, 0.91, 0.87, 0.86]}

df = pd.DataFrame(data)

N = 10
n_col_names = [f"n+{i+1}" for i in range(N)]
q_col_names = [f"q+{i+1}" for i in range(N)]

rng = np.random.default_rng(42)
df[n_col_names] = rng.normal(df["Mean"], df["STD"], size=(N, df.shape[0])).T
df[q_col_names] = df[n_col_names].apply(lambda x: pd.qcut(x, 5, labels=False))

相关问题