合并熊猫数据框,交替排列行,而不写行

时间:2019-10-08 08:15:55

标签: python pandas correlation

我正在尝试在我的Pandas输出中模仿一个spss样式相关表,以使习惯于查看以这种方式布置的矩阵的主管更易于阅读(并且很烦我不再使用SPSS,因为它是让他们难以阅读)。

这意味着存在一个表格,其中p值直接位于表格中相关系数的上方。我很容易产生p值和系数,并将它们保存到单独的数据框中,如下所示。

pvals
    T   4    Rw    Af
T |0.00|0.05|0.24|0.01
4 |0.05|0.00|0.76|0.03
Rw|0.24|0.76|0.00|0.44
...

rs
    T   4    Rw    Af
T |1.00|0.65|0.28|0.44
4 |0.65|1.00|0.01|0.03
Rw|-0.03|0.01|1.00|0.32
...

我想做的是创建一个表,其中两个数据帧在不更改索引顺序的情况下合并。看起来像

T |P |0.00|0.05|0.24|0.01
  |r |1.00|0.65|0.28|0.44
Rw|P |0.05|0.00|0.76|0.03
  |r |0.65|1.00|0.01|0.03
...

现在,我了解到,如果我的列中按字母顺序排列的名称,我可以使用类似的

pd.concat([pvals, rs]).sort_index(kind='merge')

但是,我的列是用描述性的,无序的名称命名的,因此这行不通,因为它会将索引重新排序为字母顺序。我也知道

df.corr() 

会产生一个矩阵,就像我上面给出的rs示例一样,但这不是我想要的。

如果有人有任何建议,我将非常感谢。

Kev

1 个答案:

答案 0 :(得分:2)

您可以将助手MultiIndexnp.arange一起使用,将DataFrame.set_indexappend=True一起使用,为keysP添加r参数值,按range排序,删除此级别,并按DataFrame.swaplevel删除级别的最后更改顺序:

s1 = pvals.set_index(np.arange(len(pvals)), append=True)
s2 = rs.set_index(np.arange(len(rs)), append=True)

df = (pd.concat([s1, s2], keys=('P','r'))
        .sort_index(kind='merge', level=2)
        .reset_index(level=2, drop=True)
        .swaplevel(0,1))
print (df)
         T     4    Rw    Af
T  P  0.00  0.05  0.24  0.01
   r  1.00  0.65  0.28  0.44
4  P  0.05  0.00  0.76  0.03
   r  0.65  1.00  0.01  0.03
Rw P  0.24  0.76  0.00  0.44
   r -0.03  0.01  1.00  0.32

询问者编辑

将代码更改为

后,此答案有效
s1 = pvals.assign(a = np.arange(len(pvals))).set_index('a', append=True) 
s2 = rs.assign(a = np.arange(len(rs))).set_index('a', append=True)

df = (pd.concat([s1, s2], keys=('P','r'))
        .sort_index(kind='merge', level=2)
        .reset_index(level=2, drop=True)
        .swaplevel(0,1))

由应答者推荐。