因此,我有一个表示各种模型估计的数据框,用于估算一组候选人中每个候选人赢得选举的可能性。
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似乎仅适用于查找单个列表中的所有组合。
答案 0 :(得分:2)
使用:
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
答案 1 :(得分:2)
提供代码总是更好,这样我们就可以快速创建框架,而不仅仅是表格。您可以通过任何方式创建通用的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)
只需根据需要更改列名称。