혼합 유형 열이있는 팬더 데이터 프레임이 있으며 일부 열에 sklearn의 min_max_scaler를 적용하고 싶습니다. 이상적으로는 이러한 변형을 제자리에서 수행하고 싶지만 아직 그렇게 할 방법을 찾지 못했습니다. 작동하는 다음 코드를 작성했습니다.
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
스케일러에 시리즈를 전달하지 못하는 이유가 혼란 스럽습니다. 위의 전체 작업 코드에서 시리즈를 스케일러로 전달하고 데이터 프레임 열 =을 스케일링 된 시리즈로 설정하려고했습니다. 나는이 질문이 다른 곳에서 묻는 것을 보았지만 좋은 대답을 찾지 못했습니다. 여기에서 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 것입니다!
bad_output = in_max_scaler.fit_transform(dfTest['A'].values)
작동하지 않았습니다. @larsmans-그래, 나는이 길을 내려가는 것에 대해 생각했다. 팬더가 전체 데이터 프레임을 sklearn 함수에 전달할 수는 있지만 버그는 아닌지 모르겠습니다. 데이터 프레임에 대한 나의 이해는 그것이 일련의 기사라는 것입니다. "Python for Data Analysis"책을 읽으면 NumPy 중심 응용 프로그램에서 쉽게 사용할 수 있도록 팬더가 numpy 위에 빌드되어 있다고합니다.
bad_output = min_max_scaler.fit_transform(dfTest['A'].values)
?values
속성에 액세스하면 numpy 배열이 반환됩니다. 어떤 이유로 때로는 scikit learn api가 팬더가 numpy 배열을 반환하도록하는 올바른 메소드를 올바르게 호출하지만 때로는 그렇지 않습니다.