Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 合并数据帧,交替行而不排序行_Python_Pandas_Correlation - Fatal编程技术网

Python 合并数据帧,交替行而不排序行

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 ...

我试图在我的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

您可以使用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))