Python 合并数据帧,交替行而不排序行
我试图在我的Pandas输出中模拟spss风格的关联表,以便让那些习惯于看到矩阵以这种方式排列的主管更容易阅读(并且对我不再使用spss感到恼火,因为他们更难阅读) 这意味着有一个表,其中p值直接位于表中相关系数的上方。我已经很容易地生成了p值和系数,并将它们保存到一个单独的数据框中,如下所示Python 合并数据帧,交替行而不排序行,python,pandas,correlation,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 ...
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您可以使用helper
multi index
和np.arange
以及append=True
,为p
添加键
参数,r
值,按范围
s排序,通过以下方式删除此级别和级别的最后更改顺序:
询问者编辑
一旦代码更改为
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))
这是回答者推荐的。非常感谢您抽出时间。然而,当我运行这段代码时,我得到了一个错误:
numpy.ndarray'对象没有属性“set_index”
知道为什么会发生这种情况吗?@kevomalley 743-你的熊猫版本是什么?对我来说,它在pandas 0.25.0中工作得很好。@Kevomalley 743-如果不工作,这里是前两行代码的替换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)
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))