python - 如何使用熊猫创建概率矩阵
问题描述
这是我的情况。
我有 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()
将它们放在一起,但它不像我想要的那样工作。
解决方案
正如@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
推荐阅读
- c - 为什么我在运行此代码时会出现分段错误?
- r - 我想绘制测试的大小(例如 t test )与样本大小。如何在 R 中做到这一点?
- php - docker-compose nginx 向 php-fpm 返回 502
- c# - 验证 .NET Core Web API 控制器方法参数的更优惠方法是:返回 BadRequestResult 还是抛出异常?
- angular - 在Angular中对表格列进行排序
- php - 调用API时如何在PHP中打印出汉字?
- python - 如何从延迟的 dask 数组中获取特定的块?
- firebase - 安装 firebase 工具在 mac 上不起作用
- python - 切换到数据框中的多行索引创建的表单列表
- selenium - 你能通过自动化浪费谷歌添加吗