gpt4 book ai didi

python - Pandas 随机加权选择

转载 作者:太空狗 更新时间:2023-10-30 02:54:36 28 4
gpt4 key购买 nike

我想使用 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,因为它位于 column 0row 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 列。

关于python - Pandas 随机加权选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45223537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com