首页 > 解决方案 > 如何使用熊猫创建概率矩阵

问题描述

这是我的情况。

我有 3 个元素,假设它们的名字是

['a', 'b', 'c']

对于每个元素,它的值可以是从 0 到 100 的任何值,步长为 50。这是来自的值之一

[0, 50, 100]

现在我想创建一个包含这些元素的所有可能性的数据框,数据框将如下表所示。这里为简单起见,我在示例中使用 3 个元素['a','b','c']和 50 个作为步长,但在实际情况中,元素会多于 3 个,步长会小得多:

一个 b C
0 0 0 0
1 0 0 50
2 0 0 100
3 0 50 0
4 0 50 50
5 0 50 100
6 0 100 0
7 0 100 50
8 0 100 100
9 50 0 0
10 50 0 50
11 50 0 100
12 50 50 0
13 50 50 50
14 50 50 100
15 50 100 0
16 50 100 50
17 50 100 100
18 100 0 0
19 100 0 50
20 100 0 100
21 100 50 0
22 100 50 50
23 100 50 100
24 100 100 0
25 100 100 50
26 100 100 100

我怎样才能有效地创建这个数据框,而无需在另一个 for 循环中执行类似 for loop inside for loop 之类的操作?

我尝试创建单独的数据框pd.DataFrame({'a':[0,50,100]}),然后pd.merge()将它们放在一起,但它不像我想要的那样工作。

标签: pythonpandas

解决方案


正如@Shaido 建议的那样,itertools.product是您问题的正确选择。您可以动态构建您的值,其范围取决于列数。

import itertools

cols = ['a', 'b', 'c']
vals = range(0, 50*len(cols), 50)

df = pd.DataFrame(itertools.product(vals, repeat=len(cols), columns=cols)
>>> df
      a    b    c
0     0    0    0
1     0    0   50
2     0    0  100
3     0   50    0
4     0   50   50
5     0   50  100
6     0  100    0
7     0  100   50
8     0  100  100
9    50    0    0
10   50    0   50
11   50    0  100
12   50   50    0
13   50   50   50
14   50   50  100
15   50  100    0
16   50  100   50
17   50  100  100
18  100    0    0
19  100    0   50
20  100    0  100
21  100   50    0
22  100   50   50
23  100   50  100
24  100  100    0
25  100  100   50
26  100  100  100

推荐阅读