合并 pandas 个数据帧,交替行而不对行进行排序

Merging pandas dataframes, alternating rows without soritng rows

我正在尝试在我的 Pandas 输出中模仿 spss 样式的相关性 table 以使习惯于以这种方式布置矩阵(并且感到恼火)的主管更容易阅读我不再使用 SPSS,因为它们更难阅读)。

这意味着有一个 table,其中 p 值直接放在 table 中相关系数的上方。我已经轻松地生成了 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
...

我想做的是创建一个 table 合并两个数据帧而不改变索引顺序。看起来像

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 示例的矩阵,但这不是我要找的。

如果有人有任何建议,我将不胜感激。

凯夫

您可以将助手 MultiIndexnp.arangeDataFrame.set_index with append=True, add keys parameter for P, r values, sorting by ranges, remove this level and last change order of levels by 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))

回答者推荐的