2016-12-13 4 views
0

私はパンダに正方相関行列を持ち、値(常に浮動小数点-1,= x < = 1)がすべての値を上回るすべての値を返す最も効率的な方法を考えることを試みています。特定の閾値。パンダ - 全列にわたるフィルタ

pandas.DataFrame.filterメソッドは列またはRegExのリストを要求しますが、常にすべての列を渡したいと思います。これについてはベストプラクティスですか?

+5

は、あなたがサンプルを追加することができます希望の出力?もし条件外の値が 'NaN'に置き換えられたら? – jezrael

答えて

5

あなたがサンプルを提供していないので、あなたが望む出力が何であるか分かりませんが、私はあなたに何をしたいのかを2セント与えます:

In[1]: 
import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.random.rand(10,5)) 
corr = df.corr() 
corr.shape 

Out[1]: (5, 5) 

ここでは、対角を除くを除いて、相関行列の上三角(対称)をとしましょう。このためにはnp.trilを使用し、これをブール値としてキャストし、~演算子を使用してその逆を取得します。

In [2]: corr_triu = corr.where(~np.tril(np.ones(corr.shape)).astype(np.bool)) 
     corr_triu 
Out[2]: 
    0   1   2   3   4 
0 NaN 0.228763 -0.276406 0.286771 -0.050825 
1 NaN  NaN -0.562459 -0.596057 0.540656 
2 NaN  NaN  NaN 0.402752 0.042400 
3 NaN  NaN  NaN  NaN -0.642285 
4 NaN  NaN  NaN  NaN  NaN 

それでは、これをスタックし、例えば0.3上にあるすべての値をフィルタリングしてみましょう:

In [3]: corr_triu = corr_triu.stack() 
     corr_triu[corr_triu > 0.3] 
Out[3]: 
1 4 0.540656 
2 3 0.402752 
dtype: float64 

あなたはそれが少しきれいにしたい場合:

In [4]: corr_triu.name = 'Pearson Correlation Coefficient' 
     corr_triu.index.names = ['Col1', 'Col2'] 

In [5]: corr_triu[corr_triu > 0.3].to_frame() 
Out[5]: 
      Pearson Correlation Coefficient 
Col1 Col2     
1 4    0.540656 
2 3    0.402752 
+1

これは私に対称行列の場合を扱うための良い方法を教えてくれたので、私はそれを上書きしました。 –

7

これについて移動する2つの方法があります。

と仮定します。そして、あなたは、単にすることができます

In [7]: c = np.array([-1,-2,-2,-3,-4,-6,-7,-8]) 

In [8]: a = np.array([1,2,3,4,6,7,8,9]) 

In [9]: b = np.array([2,4,6,8,10,12,13,15]) 

In [10]: c = np.array([-1,-2,-2,-3,-4,-6,-7,-8]) 

In [11]: corr = np.corrcoef([a,b,c]) 

In [12]: df = pd.DataFrame(corr) 

In [13]: df 
Out[13]: 
      0   1   2 
0 1.000000 0.995350 -0.980521 
1 0.995350 1.000000 -0.971724 
2 -0.980521 -0.971724 1.000000 

In [14]: df > 0.5 
Out[14]: 
     0  1  2 
0 True True False 
1 True True False 
2 False False True 

In [15]: df[df > 0.5] 
Out[15]: 
     0  1 2 
0 1.00000 0.99535 NaN 
1 0.99535 1.00000 NaN 
2  NaN  NaN 1.0 

あなただけの値をしたい場合は、最も簡単な方法はありますvalues属性を使用して基礎となるnumpyデータ構造を処理するには:

アイハンで指摘したように

代わりの.values、あなたは自動的にNaNをドロップしても、ラベルを保持stackを...使用することができます

In [22]: df.index = ['a','b','c'] 

In [23]: df.columns=['a','b','c'] 

In [24]: df 
Out[24]: 
      a   b   c 
a 1.000000 0.995350 -0.980521 
b 0.995350 1.000000 -0.971724 
c -0.980521 -0.971724 1.000000 


In [25]: df.stack() > 0.5 
Out[25]: 
a a  True 
    b  True 
    c False 
b a  True 
    b  True 
    c False 
c a False 
    b False 
    c  True 
dtype: bool 

In [26]: df.stack()[df.stack() > 0.5] 
Out[26]: 
a a 1.00000 
    b 0.99535 
b a 0.99535 
    b 1.00000 
c c 1.00000 
dtype: float64 

いつでも戻ることができ...

In [29]: (df.stack()[df.stack() > 0.5]).unstack() 
Out[29]: 
     a  b c 
a 1.00000 0.99535 NaN 
b 0.99535 1.00000 NaN 
c  NaN  NaN 1.0 
+2

'values'に加えて、' stack() 'もNaNを自動的に落としますがラベルを保持するので便利です。 – ayhan

+0

@ayhanよろしくお願いします。 –

+0

あなたの解決策は明らかに私のものよりも自然な感じですが、不要な項目(常に(x、x))、 '( 'a'、 'b')'は '( 'b'、 'a')'と同じです。 (そして、私たちは依然として正確なOPの要件を知らないので、それはうまくいくので、私はそれを上書きしました) –

関連する問題