如何使用熊猫创建概率矩阵

时间:2021-06-24 07:01:41

标签: python pandas

这是我的情况。

我有 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 循环内的另一个 for 循环内的操作的情况下有效地创建此数据帧?

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

3 个答案:

答案 0 :(得分:0)

使用 itertools.product 创建所需值的所有组合。然后可以将其添加到数据框中:

from  itertools import product

cols = ['a', 'b', 'c']
vals = [0, 50, 100]

pd.DataFrame(list(product(vals, repeat=len(cols))), columns=cols)

答案 1 :(得分:0)

您可以使用 value_counts() 并除以行数以获得概率

pd.concat([pd.DataFrame(df[c].value_counts()/len(df)) for c in df.columns], axis=1)

输出

<头>
a b c
0 0.333333 0.333333 0.333333
100 0.333333 0.333333 0.333333
50 0.333333 0.333333 0.333333

答案 2 :(得分:0)

正如@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