【问题标题】:select a row index weighted by value选择按值加权的行索引
【发布时间】:2021-01-08 13:05:41
【问题描述】:

权重字典:{1:0.1, 2:0.9}(值为 1 的项目有 10% 的概率被选中,值为 2 的项目有 90% 的概率)

示例值行:[0, 0, 1, 0, 2, 1](只有 0 和字典中包含的值)

输出应该是随机选择的索引

对于示例行,该行中每个项目的索引被选中的概率应为[0, 0, 0.05, 0, 0.9, 0.05](注意,由于该行包含两个不同的1元素,因此每个元素的概率应为0.05被选中,因为重量计入具有该值被选中的项目)

【问题讨论】:

    标签: python pandas numpy random python-3.8


    【解决方案1】:

    您可以在此处使用np.select

    wt = {1:0.1, 2:0.9}
    a = np.array([0, 0, 1, 0, 2, 1])
    choicelist = [a==i for i in wt.keys()]
    condlist = [v/np.count_nonzero(a==k) for k,v in wt.items()]
    np.select(choicelist, condlist)
    # array([0.  , 0.  , 0.05, 0.  , 0.9 , 0.05])
    

    【讨论】:

    • 不幸的是,如果键没有在一行中表示,这将导致除以 0。例如,尝试使用wt = {1:0.1, 2:0.9, 3:0.1}
    • 使用condlist = [v/np.count_nonzero(a==k) if np.count_nonzero(a==k) > 0 else 0 for k,v in wt.items()] 工作
    • 另外,在我的情况下,使用 np.isclose 比使用相等更安全
    • 另外,如果您要在 200k x 200k df 上运行它,则需要一些时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多