使用所有索引和列的product并通过构造函数创建DataFrame,对于多个所有列使用prod:
from itertools import product
names = ['placement','strategy','category']
mux = pd.MultiIndex.from_product([df1.index, df2.index, df3.index], names=names)
df = (pd.DataFrame(list(product(df1['value'], df2['value'], df3['value'])), index=mux)
.prod(1).reset_index(name='mult'))
print (df)
placement strategy category mult
0 placementA strategyA categoryA 3.0
1 placementA strategyA categoryB 5.0
2 placementA strategyB categoryA 15.0
3 placementA strategyB categoryB 25.0
4 placementA strategyC categoryA 18.0
5 placementA strategyC categoryB 30.0
6 placementB strategyA categoryA 6.0
7 placementB strategyA categoryB 10.0
8 placementB strategyB categoryA 30.0
9 placementB strategyB categoryB 50.0
10 placementB strategyC categoryA 36.0
11 placementB strategyC categoryB 60.0
替代方案是 multiple 列表理解的所有值:
import operator
import functools
from itertools import product
names = ['placement','strategy','category']
a = list(product(df1.index, df2.index, df3.index))
b = product(df1['value'], df2['value'], df3['value'])
data = [functools.reduce(operator.mul, x, 1) for x in b]
df = pd.DataFrame(a, columns=names).assign(mult=data)
print (df)
placement strategy category mult
0 placementA strategyA categoryA 3.0
1 placementA strategyA categoryB 5.0
2 placementA strategyB categoryA 15.0
3 placementA strategyB categoryB 25.0
4 placementA strategyC categoryA 18.0
5 placementA strategyC categoryB 30.0
6 placementB strategyA categoryA 6.0
7 placementB strategyA categoryB 10.0
8 placementB strategyB categoryA 30.0
9 placementB strategyB categoryB 50.0
10 placementB strategyC categoryA 36.0
11 placementB strategyC categoryB 60.0
具有DataFrames 列表的动态解决方案,只需要在每个列中使用相同的列名value:
dfs = [df1, df2, df3]
names = ['placement','strategy','category']
a = list(product(*[x.index for x in dfs]))
b = list(product(*[x['value'] for x in dfs]))
data = pd.DataFrame(b).product(1)
df = pd.DataFrame(a, columns=names).assign(mult=data)
print (df)
placement strategy category mult
0 placementA strategyA categoryA 3.0
1 placementA strategyA categoryB 5.0
2 placementA strategyB categoryA 15.0
3 placementA strategyB categoryB 25.0
4 placementA strategyC categoryA 18.0
5 placementA strategyC categoryB 30.0
6 placementB strategyA categoryA 6.0
7 placementB strategyA categoryB 10.0
8 placementB strategyB categoryA 30.0
9 placementB strategyB categoryB 50.0
10 placementB strategyC categoryA 36.0
11 placementB strategyC categoryB 60.0