sklearn을 사용하여 데이터 프레임 열 확장
혼합형 컬럼을 가진 팬더 데이터 프레임이 있는데, 일부 컬럼에 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
왜 스케일러에 시리즈를 전달하지 못하는지 헷갈리네요.위의 전체 작업 코드에서는 일련의 데이터를 스케일러에 전달하고 데이터 프레임 열 =을 스케일링된 시리즈로 설정하고자 했습니다.
이전 버전인지 아닌지는 잘 모르겠습니다.pandas
이것을 막았지만, 다음의 단편은 나에게 완벽하게 작동하며, 사용할 필요 없이 정확히 당신이 원하는 것을 생산한다.apply
>>> import pandas as pd
>>> from sklearn.preprocessing import MinMaxScaler
>>> scaler = 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']})
>>> dfTest[['A', 'B']] = scaler.fit_transform(dfTest[['A', 'B']])
>>> dfTest
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
이렇게요?
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']
})
dfTest[['A','B']] = dfTest[['A','B']].apply(
lambda x: MinMaxScaler().fit_transform(x))
dfTest
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 = pd.DataFrame(scale.fit_transform(df.values), columns=df.columns, index=df.index)
감가상각 경고 없이 작동해야 합니다.
pir's comment에서 언급되고 있는 것처럼,.apply(lambda el: scale.fit_transform(el))
method는 다음 경고를 생성합니다.
권장 해제 경고: 1D 어레이를 데이터로 전달하면 0.17에서는 권장되지 않으며 0.19에서는 ValueError가 발생합니다.데이터에 단일 피쳐가 있는 경우 X.reshape(-1, 1)를 사용하거나 단일 샘플이 포함된 경우 X.reshape(1, -1)를 사용하여 데이터를 재구성합니다.
열을 numpy 배열로 변환하면 됩니다(Standard Scaler가 좋습니다).
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
dfTest[['A','B','C']] = scale.fit_transform(dfTest[['A','B','C']].as_matrix())
-- 2018년 11월 편집(판다 0.23.4 테스트 완료)--
Rob Murray가 코멘트에서 언급했듯이, 현재 판다의 버전(0.23.4)은.as_matrix()
돌아온다FutureWarning
따라서 다음 명령으로 대체해야 합니다..values
:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit_transform(dfTest[['A','B']].values)
--2019년 5월 편집(판다 0.24.2 테스트 완료)--
Joelostblom이 댓글에서 언급했듯이, "이후"0.24.0
, 를 사용하는 것을 권장합니다..to_numpy()
대신.values
."
업데이트된 예:
import pandas as pd
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
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']
})
dfTest[['A', 'B']] = scaler.fit_transform(dfTest[['A','B']].to_numpy())
dfTest
A B C
0 -1.995290 -1.571117 big
1 0.436356 -0.603995 small
2 0.460289 0.100818 big
3 0.630058 0.985826 small
4 0.468586 1.088469 small
다음을 사용하여 할 수 있습니다.pandas
한정:
In [235]:
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']})
df = dfTest[['A', 'B']]
df_norm = (df - df.min()) / (df.max() - df.min())
print df_norm
print pd.concat((df_norm, dfTest.C),1)
A B
0 0.000000 0.000000
1 0.926219 0.363636
2 0.935335 0.628645
3 1.000000 0.961407
4 0.938495 1.000000
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
아주 오래된 코멘트인 건 알지만 그래도
단일 브래킷 대신(dfTest['A'])
, 이중 괄호를 사용합니다.(dfTest[['A']])
.
예:min_max_scaler.fit_transform(dfTest[['A']])
.
저는 이것이 원하는 결과를 가져올 것이라고 믿습니다.
(판다 1.0.5 테스트 완료)
@athlonshi 응답(ValueError: cannot cannot confloat string to float: 'big', C컬럼에 있음)에 따라 경고 없는 완전한 작업 예제를 기반으로 합니다.
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
scale = preprocessing.MinMaxScaler()
df = 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']
})
print(df)
df[["A","B"]] = pd.DataFrame(scale.fit_transform(df[["A","B"]].values), columns=["A","B"], index=df.index)
print(df)
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
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
언급URL : https://stackoverflow.com/questions/24645153/pandas-dataframe-columns-scaling-with-sklearn
'source' 카테고리의 다른 글
precedence 및 비트마스크 (0) | 2022.11.19 |
---|---|
노드 및 오류: EMFILE, 열려 있는 파일이 너무 많습니다. (0) | 2022.11.19 |
MyISAM 레코드가 3억 5천만 개 이상인 25GB의 대용량 테이블을 업데이트하려면 어떻게 해야 합니까? (0) | 2022.11.19 |
이름이 같은 두 클래스를 가져오는 중입니다.어떻게 대처해야 할까? (0) | 2022.11.19 |
Python에서 얕은 목록 평탄화 (0) | 2022.11.19 |