从字典的完整笛卡尔积创建数据框
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
考虑一个包含不同长度的迭代的字典:
{'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
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