我有一個熊貓數據框與混合類型的列,我想申請sklearn的min_max_scaler到一些列。理想情況下,我想做這些轉換,但還沒有想出一個辦法。我寫了下面的代碼:熊貓dataframe列與sklearn縮放
import pandas as pd
import numpy as np
from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()
dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],'B':[103.02,107.26,110.35,114.23,114.68], 'C':['big','small','big','small','small']})
min_max_scaler = preprocessing.MinMaxScaler()
def scaleColumns(df, cols_to_scale):
for col in cols_to_scale:
df[col] = pd.DataFrame(min_max_scaler.fit_transform(pd.DataFrame(dfTest[col])),columns=[col])
return df
dfTest
A B C
0 14.00 103.02 big
1 90.20 107.26 small
2 90.95 110.35 big
3 96.27 114.23 small
4 91.21 114.68 small
scaled_df = scaleColumns(dfTest,['A','B'])
scaled_df
A B C
0 0.000000 0.000000 big
1 0.926219 0.363636 small
2 0.935335 0.628645 big
3 1.000000 0.961407 small
4 0.938495 1.000000 small
我很好奇,如果這是做這種轉換的首選/最有效的方式。有沒有一種方法可以使用df.apply會更好?
我也驚訝我不能讓下面的代碼工作:
bad_output = min_max_scaler.fit_transform(dfTest['A'])
如果我通過一個完整的數據幀,以它的工作原理縮放器:
dfTest2 = dfTest.drop('C', axis = 1) good_output = min_max_scaler.fit_transform(dfTest2) good_output
我很困惑爲什麼要通過一系列的縮放失敗。在上面我完整的工作代碼中,我曾希望將一個系列傳遞給縮放器,然後將dataframe列設置爲縮放系列。我已經看到這個問題問了其他幾個地方,但沒有找到一個好的答案。任何幫助瞭解這裏發生的事情將不勝感激!
它的工作原理)'?訪問'values'屬性會返回一個numpy數組,因爲某些原因,scikit learn api會正確地調用正確的方法,使得pandas返回一個numpy數組,有時它不會。 – EdChum
熊貓的數據框是相當複雜的對象,約定不符合scikit-learn的約定。如果你將所有東西都轉換成NumPy數組,scikit-learn可以更容易地處理。 –
@edChum - 'bad_output = in_max_scaler.fit_transform(dfTest ['A']。values)'也不起作用。 @larsmans - 是的,我曾想過要沿着這條路走下去,這似乎很麻煩。我不知道Pandas是否可以將完整的數據框傳遞給sklearn函數,但不是一個系列。我對數據框的理解是它是一系列的字典。閱讀「Python for Data Analysis」一書,它指出熊貓建立在numpy之上,以便在以NumPy爲中心的應用程序中使用。 – flyingmeatball