获取大熊猫数据框的多列值的组合?

时间:2018-09-02 12:04:47

标签: pandas combinations combinatorics

因此,我有一个表示各种模型估计的数据框,用于估算一组候选人中每个候选人赢得选举的可能性。

             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似乎仅适用于查找单个列表中的所有组合。

2 个答案:

答案 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)

只需根据需要更改列名称。