私はパンダに正方相関行列を持ち、値(常に浮動小数点-1,= x < = 1)がすべての値を上回るすべての値を返す最も効率的な方法を考えることを試みています。特定の閾値。パンダ - 全列にわたるフィルタ
pandas.DataFrame.filterメソッドは列またはRegExのリストを要求しますが、常にすべての列を渡したいと思います。これについてはベストプラクティスですか?
私はパンダに正方相関行列を持ち、値(常に浮動小数点-1,= x < = 1)がすべての値を上回るすべての値を返す最も効率的な方法を考えることを試みています。特定の閾値。パンダ - 全列にわたるフィルタ
pandas.DataFrame.filterメソッドは列またはRegExのリストを要求しますが、常にすべての列を渡したいと思います。これについてはベストプラクティスですか?
あなたがサンプルを提供していないので、あなたが望む出力が何であるか分かりませんが、私はあなたに何をしたいのかを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
これは私に対称行列の場合を扱うための良い方法を教えてくれたので、私はそれを上書きしました。 –
これについて移動する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
'values'に加えて、' stack() 'もNaNを自動的に落としますがラベルを保持するので便利です。 – ayhan
@ayhanよろしくお願いします。 –
あなたの解決策は明らかに私のものよりも自然な感じですが、不要な項目(常に(x、x))、 '( 'a'、 'b')'は '( 'b'、 'a')'と同じです。 (そして、私たちは依然として正確なOPの要件を知らないので、それはうまくいくので、私はそれを上書きしました) –
は、あなたがサンプルを追加することができます希望の出力?もし条件外の値が 'NaN'に置き換えられたら? – jezrael