循环遍历数据帧,计算列之间的唯一值的相关性?

时间:2016-04-05 11:34:07

标签: python pandas

我的数据框看起来像这样(但更长......):

    imd     code       sum
0     1    010101   1048171
1     2    010101    911003
2     3    010101    852023
3     4    010101    790893
4     5    010101    923344
5     6    010101    681473
6     7    010101    600303
7     8    010101    497439
8     9    010101    496209
9    10    010101    388457
10    1    010102  26284506
11    2    010102  23567345
12    3    010102  24933988
13    4    010102  22762737
14    5    010102  23205722
15    6    010102  21874259
16    7    010102  21604496
17    8    010102  16723338
18    9    010102  17691183
19   10    010102  15202808

现在,我想计算数据框中imd的每个唯一值的sumcode 之间的相关性。因此,在此示例中,代码imd的{​​{1}}和sum之间,代码010101等的相关性

然后我想要生成具有最高相关性的代码的排序列表。所以像这样:

010102

最好的方法是什么?我知道如何计算整个数据框的 code correlation 010102 0.44 010101 0.38 .... imd之间的相关性:

sum

但不是如何对作为唯一代码的数据帧的每个切片重复执行此操作。

我想我可以为每个唯一的代码值创建一个新的数据帧,为每个代码计算df[['imd','sum']].corr() imd之间的相关性,然后创建一个中间数据结构来保存相关值?

2 个答案:

答案 0 :(得分:1)

我显然对这个问题的理解与其他问题不同。 IIUC,你想要的是,根据code值,将另外两列视为向量,并找到它们的相关系数。这将是:

import numpy as np

>>> df.groupby(df.code).apply(lambda g: np.corrcoef(g.imd.values, g['sum'].values)[0][1]).sort_values()
code
10101   -0.955634
10102   -0.936554
dtype: float64

答案 1 :(得分:0)

首先,您需要groupby code列,然后根据imdsum列应用相关性,如下所示:

df
Out[6]: 
    imd   code       sum
0     1  10101   1048171
1     2  10101    911003
2     3  10101    852023
3     4  10101    790893
4     5  10101    923344
5     6  10101    681473
6     7  10101    600303
7     8  10101    497439
8     9  10101    496209
9    10  10101    388457
10    1  10102  26284506
11    2  10102  23567345
12    3  10102  24933988
13    4  10102  22762737
14    5  10102  23205722
15    6  10102  21874259
16    7  10102  21604496
17    8  10102  16723338
18    9  10102  17691183
19   10  10102  15202808

df.groupby('code')[['imd','sum']].corr()
Out[7]: 
                imd       sum
code                         
10101 imd  1.000000 -0.955634
      sum -0.955634  1.000000
10102 imd  1.000000 -0.936554
      sum -0.936554  1.000000