Python 对相关的每一列进行独立排序,并获取索引值

Python 对相关的每一列进行独立排序,并获取索引值,python,numpy,pandas,Python,Numpy,Pandas,我想知道我的DataFrame中每一列相对于其他每一列从最高相关性到最低相关性的顺序 例子 看起来像: A B C D 0 0.44 0.41 0.46 0.47 1 0.46 0.02 0.85 0.82 2 0.78 0.76 0.93 0.83 3 0.88 0.93 0.72 0.12 4 0.15 0.20 0.44 0.10 5 0.28 0.61 0.09 0.84 相关表如下所示: print

我想知道我的
DataFrame
中每一列相对于其他每一列从最高相关性到最低相关性的顺序

例子 看起来像:

      A     B     C     D
0  0.44  0.41  0.46  0.47
1  0.46  0.02  0.85  0.82
2  0.78  0.76  0.93  0.83
3  0.88  0.93  0.72  0.12
4  0.15  0.20  0.44  0.10
5  0.28  0.61  0.09  0.84
相关表如下所示:

print df.corr()

          A         B         C         D
A  1.000000  0.702557  0.689214  0.005000
B  0.702557  1.000000  0.038306 -0.113245
C  0.689214  0.038306  1.000000  0.074773
D  0.005000 -0.113245  0.074773  1.000000
我希望对列
B
进行排序
['B','A','C','D']
DataFrame
应该是这样的吗

   A  B  C  D
A  A  B  C  D
B  B  A  A  C
C  C  C  D  A
D  D  D  B  B

另外,我计划在2-4万列宽的
数据帧上执行此操作,因此性能是一个问题。

因此您需要一个计算协变量和标准偏差的函数

def std(l):
    m = sum(l)/float(len(l))
    return((sum([(m-k)*2 for k in l])/float(len(m)))**0.5)

import itertools as itt

def pc(l1,l2):
    m1 = sum(l1)/float(len(l1))
    m2 = sum(l2)/float(len(l2))
    cov = sum([(k[1]-m2)*(k[0]-m1)for k in itt.zip(l1,l2)])/flaot(len(itt.zip(l1,l2)))
    return(cov / (std(l1)*std(l2)))

现在您已经拥有了所需的函数,只需遍历所有的行对,获取所需的数据,并对其执行所需的操作。

我认为这会起作用:

In [11]:
df.corr().apply(lambda x: x.sort_values(ascending=False).index)

Out[11]:
   A  B  C  D
A  A  B  C  D
B  B  A  A  C
C  C  C  D  A
D  D  D  B  B
因此,这将对每列应用
排序\u值
,并返回索引


不确定这将如何在40k列df上进行缩放,但问题是当前df上的
排序_值
只能按特定列或行df宽进行排序

如何将索引作为数值而不是字符串进行排序,这对您有用吗?作为一个NumPy数组作为输出?
In [11]:
df.corr().apply(lambda x: x.sort_values(ascending=False).index)

Out[11]:
   A  B  C  D
A  A  B  C  D
B  B  A  A  C
C  C  C  D  A
D  D  D  B  B