独立地对每列相关性进行排序并获得索引值

时间:2016-05-22 07:51:32

标签: python numpy pandas

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

实施例

np.random.seed([3,1415])

df = pd.DataFrame(np.random.rand(6, 4).round(2), columns=list('ABCD'))

看起来像:

      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

另外,我计划在DataFrames范围内从20到40,000列扩展这样做,因此性能是一个问题。

2 个答案:

答案 0 :(得分:3)

我认为这样可行:

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

因此,这会在每列上应用sort_values并返回索引

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

答案 1 :(得分:0)

因此,您需要一个计算协方差和标准差的函数。

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

现在您拥有了所需的功能,您只需遍历所有行对并获取所需的数据,并执行您需要执行的操作。