2017-08-02 96 views
0

我有一個包含我的原始數據的數據幀:Python的熊貓數據框:匹配列名行索引」

  Var1 Var2   Var3 
0 3090.032408 18.0 1545.016204 
1 3048.781680 18.0 1524.390840 
2 3090.032408 18.0 1545.016204 
3 3112.086341 18.0 1556.043170 
4 3075.100780 16.0 1537.550390 

和含有與該變量在我的第一個數據幀值的數據幀:

 minVal maxVal 
Var1 3045 4000 
Var2  15  19 
Var3 1500 1583 

對於DF1中的每一列,我需要找到DF2中的相關行,以應用標準化,其中我正在減去minVal併除以範圍。 DF1中的列1可能與DF2中的行1不相關 - DF2中的行數多於DF1中的列數。

如何循環訪問我的列並以高效的方式應用標準化?

非常感謝

+0

您可以顯示具有某些預期輸出的數據幀嗎? –

+0

輸出將是一個與'DF1'具有相同大小和形狀的數據幀,但每列都將被標準化並且值在0和1之間。 – jlt199

回答

2

由於大熊貓自動索引比對,表達這種計算是非常容易的:

(DF1-DF2['minVal'])/(DF2['maxVal']-DF2['minVal']) 

import pandas as pd 

DF1 = pd.DataFrame({ 
    'Var1': [3090.032408, 3048.78168, 3090.032408, 3112.086341, 3075.10078], 
    'Var2': [18.0, 18.0, 18.0, 18.0, 16.0], 
    'Var3': [1545.016204, 1524.39084, 1545.016204, 1556.04317, 1537.55039]}) 

DF2 = pd.DataFrame({'maxVal': [4000, 19, 1583,10], 'minVal': [3045, 15, 1500,11], 
       'A':[1,2,3,12], 'B':[5,6,7,13]}, 
        index=['Var1', 'Var2', 'Var3','Var4']) 

DF3 = DF2.loc[DF1.columns, :] 
result = (DF1-DF3['minVal'])/(DF3['maxVal']-DF3['minVal']) 
print(result) 

產量

 Var1 Var2  Var3 
0 0.047154 0.75 0.542364 
1 0.003960 0.75 0.293866 
2 0.047154 0.75 0.542364 
3 0.070247 0.75 0.675219 
4 0.031519 0.25 0.452414 
+0

是的,這很簡單! 'DF2'中的行數多於'DF1'中的列數,所以我列出了一些'nan'的列。我應該如何克服這一點? – jlt199

+0

您可以使用DF3 = DF2.loc [DF1.columns,]來將DF2限制爲那些標籤與DF1中的列匹配的行。我已經編輯了上面的代碼來展示我的意思。 – unutbu

+0

...或者你可以調用'result = result.dropna(axis = 1,how ='all')'來移除所有NaN的列,但這看起來有點草率。 – unutbu

0

這裏有一個簡單的方法得到w你想要的帽子。計算每列的最小值,最大值,範圍

df2 = (df - df.min())/(df.max() - df.min()) 
+0

謝謝,但我已經從訓練集中保存了'DF2',現在我已經重新加載了它,並且想要對測試集應用相同的轉換,測試集可能有不同的min和最大值。 – jlt199

+0

gotcha。你在使用scikit-learn嗎?如果是這樣,您可以在測試集上安裝StandardScaler()或MinMaxScaler(任何縮放器),並在訓練集上重新使用。 – Andrew

+0

我正在使用StandardScaler,但無法解決如何保存和重用,因此我只是切換到手動執行。我認爲我更喜歡它,但我有更多的控制權並可以嘗試不同的標準化方法 – jlt199