微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 熊猫随机加权选择

我想使用Pandas随机选择一个值来考虑加权.

DF:

   0  1  2  3  4  5
0  40  5 20 10 35 25
1  24  3 12  6 21 15
2  72  9 36 18 63 45
3  8   1  4  2  7 5
4  16  2  8  4 14 10
5  48  6 24 12 42 30

我知道使用np.random.choice,例如:

x = np.random.choice(
  ['0-0','0-1',etc.], 
  1,
  p=[0.4,0.24 etc.]
)

所以,我想从df获得一个类似于np.random.choice的样式/替代方法输出,但是使用Pandas.与上面手动插入值相比,我想以更有效的方式这样做.

使用np.random.choice我知道所有值必须加起来1.我不知道如何解决这个问题,也不确定使用Pandas基于权重随机选择一个值.

当提到输出时,如果随机选择的权重是例如40,那么输出将是0-0,因为它位于该列0,行0等等.

解决方法:

堆叠DataFrame:

stacked = df.stack()

标准化权重(使它们加起来为1):

weights = stacked / stacked.sum()
# As GeoMatt22 pointed out, this part is not necessary. See the other comment.

然后使用示例:

stacked.sample(1, weights=weights)
Out: 
1  2    12
dtype: int64

# Or without normalization, stacked.sample(1, weights=stacked)

DataFrame.sample方法允许您从行或列中进行采样.考虑一下:

df.sample(1, weights=[0.4, 0.3, 0.1, 0.1, 0.05, 0.05])
Out: 
    0  1   2  3   4   5
1  24  3  12  6  21  15

它选择一行(第一行有40%的几率,第二行有30%的几率等)

这也是可能的:

df.sample(1, weights=[0.4, 0.3, 0.1, 0.1, 0.05, 0.05], axis=1)
Out: 
   1
0  5
1  3
2  9
3  1
4  2
5  6

相同的过程但是有40%的可能性与第一列相关联,我们从列中进行选择.但是,您的问题似乎暗示您不想选择行或列 – 您想要选择内部的单元格.因此,我将尺寸从2D更改为1D.

df.stack()

Out: 
0  0    40
   1     5
   2    20
   3    10
   4    35
   5    25
1  0    24
   1     3
   2    12
   3     6
   4    21
   5    15
2  0    72
   1     9
   2    36
   3    18
   4    63
   5    45
3  0     8
   1     1
   2     4
   3     2
   4     7
   5     5
4  0    16
   1     2
   2     8
   3     4
   4    14
   5    10
5  0    48
   1     6
   2    24
   3    12
   4    42
   5    30
dtype: int64

因此,如果我现在从中进行采样,我将同时采样一行和一列.例如:

df.stack().sample()
Out: 
1  0    24
dtype: int64

选择第1行和第0列.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐