2016-04-05 4 views
1

私はこの(しかし、長い...)のように見えるデータフレーム持っている:データフレームをループし、列間の相関を計算して列の一意の値を求めますか?

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 

今、私はデータフレームでcodeのすべてのユニークな値のためimdsum間の相関を計算しますが。したがって、この例では、コード010102のコード010101ためimdsumとの間の相関関係、など

は、その後、私は最高の相関関係を持つコードのランク付けリストを生成します。だからこのようなもの:

code correlation 
    010102 0.44 
    010101 0.38 
    .... 

これを行うにはどうすればよいですか?ユニークなコードであるデータフレームの各スライスのために繰り返しそれを行うにはどのように

df[['imd','sum']].corr() 

ではなく、私は、全体のデータフレームのためimdsumとの間の相関を計算する方法を知っています。

コードのユニークな値ごとに新しいデータフレームを作成し、それぞれについてimdsumの間の相関を計算し、次に相関値を保持する中間データ構造を作成することができましたか?

答えて

1

私は明らかに違った他よりも質問を理解してきました。 IIUC、あなたが望むものは、code値ごとに、他の2つの列をベクトルとして扱い、それらの相関係数を見つける。これは次のようなものです:

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 
0

まず、以下に示すようにimdsum列に基づいて相関を適用し、その後、code列をgroupbyする必要があります。

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 
関連する問題