从字典的完整笛卡尔积创建数据框

Creating a dataframe from the full cartesian product of a dictionary

考虑一个包含不同长度的迭代的字典:

{'column_1': range(10),
 'column_2': range(3),
 'column_3': ['foo']}

我想创建一个包含这些条目的完整笛卡尔积的数据框。即:

column 1, column_2, column_3
       0         0     'foo'
       0         1     'foo'
       0         2     'foo'
       1         0     'foo'           
       1         1     'foo'          
       1         2     'foo'           
           ...
       9         2     'foo'           

如何在 Pandas 中执行此操作?也许使用 collections?

不太熟悉 pandas 但这可能有用:

d={'column_1': range(10),
'column_2': range(3),
 'column_3': ['foo']}

import pandas as pd

from collections import OrderedDict
from itertools import product

od = OrderedDict(sorted(d.items()))
cart = list(product(*od.values()))

df = pd.DataFrame(cart,columns=od.keys())
print(df)


       column_1  column_2 column_3
0          0         0      foo
1          0         1      foo
2          0         2      foo
3          1         0      foo
4          1         1      foo
5          1         2      foo
6          2         0      foo
7          2         1      foo
8          2         2      foo
9          3         0      foo
10         3         1      foo
11         3         2      foo
12         4         0      foo
13         4         1      foo
14         4         2      foo
15         5         0      foo
16         5         1      foo
17         5         2      foo
18         6         0      foo
19         6         1      foo
20         6         2      foo
21         7         0      foo
22         7         1      foo
23         7         2      foo
24         8         0      foo
25         8         1      foo
26         8         2      foo
27         9         0      foo
28         9         1      foo
29         9         2      foo

这“有点”晚了,但这是一个完整的 pandas 解决方案。

首先使用 pandas.MultiIndex.from_product 从字典值的笛卡尔积构造一个 MultiIndex。字典键用于命名索引级别。 然后使用 pandas.MultiIndex.to_frame

将每个索引级别转换为 DataFrame 列
import pandas as pd

d = {
    'column_1': range(10), 
    'column_2': range(3), 
    'column_3': ['foo']
}

df = pd.MultiIndex.from_product(d.values(), names=d.keys()).to_frame(index=False)

输出

>>> df

    column_1  column_2 column_3
0          0         0      foo
1          0         1      foo
2          0         2      foo
3          1         0      foo
4          1         1      foo
5          1         2      foo
6          2         0      foo
7          2         1      foo
8          2         2      foo
9          3         0      foo
10         3         1      foo
11         3         2      foo
12         4         0      foo
13         4         1      foo
14         4         2      foo
15         5         0      foo
16         5         1      foo
17         5         2      foo
18         6         0      foo
19         6         1      foo
20         6         2      foo
21         7         0      foo
22         7         1      foo
23         7         2      foo
24         8         0      foo
25         8         1      foo
26         8         2      foo
27         9         0      foo
28         9         1      foo
29         9         2      foo