这是我的情况。
我有 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()
将它们放在一起,但它不像我想要的那样工作。
答案 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