我正在尝试在我的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
答案 0 :(得分:2)
您可以将助手MultiIndex
与np.arange
一起使用,将DataFrame.set_index
与append=True
一起使用,为keys
,P
添加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))
由应答者推荐。