使用一个字典的全笛卡尔积创建一个数据框架

3

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

{'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吗?
2个回答

3

我对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

差不多了。我正在使用Python 3,并将cart = list(product(*od.itervalues()))替换为cart = list(product(*od.values()))(需要用于Python 3),但它会出现“TypeError数据类型不被理解”的错误。 - Amelio Vazquez-Reina
2
啊,好的,请让我再看一下,显式传递数据类型可以吗? - Padraic Cunningham
我正在Python 3.4.2上运行完全相同的玩具示例。我刚刚在一个新的IPython shell上再次尝试(也使用了最新的IPython),但遇到了相同的问题。 - Amelio Vazquez-Reina
1
啊,好的,不是它,是itertools.product,抱歉,我以为我已经导入了它。 - Padraic Cunningham
问题已经解决了。谢谢!太好了,这很有用。 - Amelio Vazquez-Reina
显示剩余5条评论

2
这有点晚了,但这里有一个完整的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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接