所以我有一个数据框表示各组候选人中的每一个的可能性的各种模型估计。
Steve John
Model1 0.327586 0.289474
Model2 0.322581 0.285714
Model3 0.303030 0.294118
我想要一个表示跨列的模型值的所有组合的数据帧。所以上面的内容将转化为下面的内容。
model Steve value Steve model John value John
0 Model1 0.327586 Model1 0.289474
1 Model1 0.327586 Model2 0.285714
2 Model1 0.327586 Model3 0.294118
3 Model2 0.322581 Model1 0.289474
4 Model2 0.322581 Model2 0.285714
5 Model2 0.322581 Model3 0.294118
6 Model3 0.303030 Model1 0.289474
7 Model3 0.303030 Model2 0.285714
8 Model3 0.303030 Model3 0.294118
以上是一个简单的例子,但理论上我希望能够为N个模型和M个候选人做到这一点,从而得到一个N ^ M行和2M列的数据帧(实际上N <20,M <6)。
在寻找答案时,我已经看到了很多关于itertools模块的建议,但是无法弄清楚如何在多个列表中获取所有组合(itertools.combinations似乎只适用于查找所有单个列表中的组合)。
提供代码总是更好,这样我们就可以快速创建框架,而不仅仅是表格。任何方式你可以创建一个共同的key
,并可以像交叉连接一样做数据库以获得最终结果。你可以在一行中完成,但我正在一步一步地做。
import pandas as pd
df = pd.DataFrame({'model': ['model1', 'model2'],
'steve': ['a', 'b'],
'jhon': ['c', 'd']
})
# create a common key
df['key'] = 'xyz'
# create two seperate dataframe for self join
# but it is possible to use the direct operation (right side) in
# inside of merge funciton
df_steve = df [['model', 'steve', 'key']]
df_jhon = df [['model', 'jhon', 'key']]
# self join
pd.merge(df_steve, df_jhon, on='key', suffixes=('_steve', '_jhon')).drop('key', axis=1)
输出:
model_steve steve model_jhon jhon
0 model1 a model1 c
1 model1 a model2 d
2 model2 b model1 c
3 model2 b model2 d
单线代码:
cross_df = pd.merge(df[['model', 'steve', 'key']],
df[['model', 'jhon', 'key']],
on='key',
suffixes=('_steve', '_jhon')
).drop('key', axis=1)
只需根据需要更改列名称。
使用:
from itertools import product
#get all combinations of all columns
a = product(*[zip(df.index, x) for x in df.T.values])
#create new columns names
cols = [c for x in df.columns for c in ('model_' + x, 'value_' + x)]
#flattening nested lists with DataFrame contructor
df1 = pd.DataFrame([[y for x in z for y in x] for z in a], columns=cols)
print (df1)
model_Steve value_Steve model_John value_John
0 Model1 0.327586 Model1 0.289474
1 Model1 0.327586 Model2 0.285714
2 Model1 0.327586 Model3 0.294118
3 Model2 0.322581 Model1 0.289474
4 Model2 0.322581 Model2 0.285714
5 Model2 0.322581 Model3 0.294118
6 Model3 0.303030 Model1 0.289474
7 Model3 0.303030 Model2 0.285714
8 Model3 0.303030 Model3 0.294118