2016-08-18 15 views
0

重要度を表す値の範囲にスケールする必要があるNxN DataFrameがあります.0は無関係、3は非常に重要です。Pandas DataFrame:列の最小値/最大値に基づいて値を計算する

私はもちろん、各列の最小値と最大値に依存します。Col Aの範囲は1〜12、Col Bの範囲は1M〜45Mです。

私が使用している式は次のとおりです。

min_importance + ((max_importance - min_importance)/(max_spec_value - min_spec_value)) * (spec_value - min_spec_value)

識別のために、後に必要とされているインデックスを、保持しつつ、どのように私は、各列のスケーリングされた値を持つ新しいデータフレームや辞書を作成するのですか?

上記の式で関数を作成し、apply()を使用して各行の関数を呼び出そうとしましたが、min/max列を関数に渡すことができません。

データフレームのサンプル( "ボディ:小売価格" と "ボディ:センサーの解像度は" 列です):

      Body: retail price Body: sensor resolution 
Body name                
Nikon D500      2000.00     20668416 
Nikon D7000      1200.00     16084992 
Sony Alpha 7R II     3199.00     42177408 
Canon EOS 5D Mark III    3499.00     22118400 
Canon 7D Mark II     1799.00     19961856 
iPhone 6 (front)     699.00     1000000 
iPhone 6 (rear)     699.00     7990272 
Fujifilm X-T1      1299.95     15980544 
Fujifilm X-T2      1599.00     24000000
+0

'pd.cut'を使用して各列にビンを割り当てることはできますか? –

+0

DataFrameのサンプルを投稿できますか? – ayhan

+0

@ayhan元の質問にサンプルを追加しました。 – seadragon

答えて

1

最小 - 最大正規化はして行うことができます。

(df - df.min())/(df.max() - df.min()) 
Out: 
         Body: retail price Body: sensor resolution 
Body name               
Nikon D500      0.464643     0.477651 
Nikon D7000      0.178929     0.366341 
Sony Alpha 7R II     0.892857     1.000000 
Canon EOS 5D Mark III   1.000000     0.512864 
Canon 7D Mark II     0.392857     0.460492 
iPhone 6 (front)     0.000000     0.000000 
iPhone 6 (rear)     0.000000     0.169760 
Fujifilm X-T1     0.214625     0.363805 
Fujifilm X-T2     0.321429     0.558559 

あなたドン」適用する必要があります。 df.min()はシリーズを返し、df - df.min()を実行すると、pandasは各値から対応する列の最小値を減算します。これは、タスクを容易にする放送と呼ばれます。

あなたはカラムごとに異なる重要度を持っている場合は、行うための最善のことは、データフレーム内に格納することです:

importances = pd.DataFrame({'max_imp': [1, 3], 'min_imp': [0, 0]}, index= df.columns) 
importances 
Out: 
         max_imp min_imp 
Body: retail price    1  0 
Body: sensor resolution  3  0 

今同じ原理で、あなたの数式を調整することができます。

importances['min_imp'] + ((importances['max_imp'] - importances['min_imp'])/(df.max() - df.min())) * (df - df.min()) 
Out: 
         Body: retail price Body: sensor resolution 
Body name               
Nikon D500      0.464643     1.432952 
Nikon D7000      0.178929     1.099024 
Sony Alpha 7R II     0.892857     3.000000 
Canon EOS 5D Mark III   1.000000     1.538591 
Canon 7D Mark II     0.392857     1.381475 
iPhone 6 (front)     0.000000     0.000000 
iPhone 6 (rear)     0.000000     0.509280 
Fujifilm X-T1     0.214625     1.091415 
Fujifilm X-T2     0.321429     1.675676 

インデックスはimportancesで、実際のデータフレームの列は一致する必要があります。この例では、最初の列の範囲は[0-1]に変換され、2番目の列の範囲は[0-3]に変換されます。

+0

偉大な私はこれを試して、報告する! – seadragon

+0

それは素晴らしい、ありがとう! dfの仕組みをより良くするために放送を調べるつもりです。 – seadragon

+0

インデックスを列名と一致させることはどのように知っていますか? – seadragon

関連する問題