首页 > 解决方案 > 使用 np.random 跳转分布

问题描述

我编写了以下代码,它从均匀分布中随机选择一个介于 0 和 1 之间的数字,并根据特定条件将其与“LF”值相关联。

    df['RAND'] = np.random.uniform(0, 1, size=df.index.size)

    conditions = [
        df['RAND'] >= (1 - 0.8062),
        (df['RAND'] < (1 - 0.8062)) & (df['RAND'] >= 0.1),
        (df['RAND'] < 0.1) & (df['RAND'] >= 0.05),
        (df['RAND'] < 0.05) & (df['RAND'] >= 0.025),
        (df['RAND'] < 0.025) & (df['RAND'] >= 0.0125),
        (df['RAND'] < 0.0125)
    ]
    choices = ['LF0', 'LF1', 'LF2', 'LF3', 'LF4', 'LF5']
    df['LF'] = np.select(conditions, choices)
    # print(df['LF'])
    print(df.pivot_table(index=df['LF'], aggfunc=len, fill_value=0))

我遇到的问题是,当我生成数据透视表时,我注意到分布中有“跳跃” - 也就是说,跳过了“LF”值。我在下面的输出图片中包含了一个链接,其中跳过了“LF4”值:

LF 数据透视表

有人可以为我解释一下吗?提前致谢。

标签: pandasnumpy

解决方案


您的代码有效,您的样本量太小了。如果您增加随机值的数量,或重复运行,您应该会看到它工作正常。

提示:您需要的条件是您需要的两倍,因为np.select()需要第一个匹配项。所以:

conditions = [
    df['RAND'] >= (1 - 0.8062),
    df['RAND'] >= 0.1,
    df['RAND'] >= 0.05,
    df['RAND'] >= 0.025,
    df['RAND'] >= 0.0125,
    df['RAND'] < 0.0125, # same as np.isfinite(), or True if no NANs
]

这与您的代码完全相同。


推荐阅读