Mam pandasową ramkę danych z kolumnami typu mieszanego, a do niektórych kolumn chciałabym zastosować minilax_scaler firmy sklearn. Idealnie, chciałbym wprowadzić te transformacje w miejscu, ale nie znalazłem jeszcze sposobu, aby to zrobić. Napisałem następujący kod, który działa:panda kolumny ramek danych skalowanie ze 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
Jestem ciekawy, czy jest to preferowany/najbardziej efektywny sposób przeprowadzenia tej transformacji. Czy istnieje sposób mogę użyć df.apply, że byłoby lepiej?
Jestem również zaskoczony, nie mogę się następujący kod do pracy:
bad_output = min_max_scaler.fit_transform(dfTest['A'])
Gdybym przejść całą dataframe do skalera to działa:
dfTest2 = dfTest.drop('C', axis = 1) good_output = min_max_scaler.fit_transform(dfTest2) good_output
Jestem zdezorientowany, dlaczego przejście serii do skalera kończy się niepowodzeniem. W moim pełnym roboczym kodzie powyżej miałem nadzieję, że po prostu przekażę serię do skalera, a następnie ustawię kolumnę typu danych = w skalowanej serii. Widziałem, jak to pytanie zadawało kilka innych miejsc, ale nie znalazłem dobrej odpowiedzi. Każda pomoc w zrozumieniu tego, co się tutaj dzieje, byłaby ogromnie doceniona!
to działa, jeśli nie to 'bad_output = min_max_scaler.fit_transform (dfTest [ 'a'] wartości.) '? uzyskanie dostępu do atrybutu "values" zwraca tablicę numpy, z jakiegoś powodu czasami api do nauki scikit poprawnie wywoła właściwą metodę, która sprawia, że pandy zwracają tablicę numpy, a czasem nie. – EdChum
Frameworki Pand to dość skomplikowane obiekty z konwencjami, które nie pasują do konwencji science-fiction. Jeśli skonwertujesz wszystko na tablice NumPy, scikit-learn stanie się o wiele łatwiejszy w obsłudze. –
@edChum - 'bad_output = in_max_scaler.fit_transform (dfTest ['A'] wartości)' nie działa. @larsmans - tak, myślałam o pójściu tą trasą, to po prostu wygląda na kłopot. Nie wiem, czy to błąd, czy nie, że Pandy mogą przekazać pełną ramkę danych do funkcji sklearn, ale nie serii. Moje zrozumienie ramy danych polegało na tym, że jest to dyktat serii.W książce "Python for Data Analysis" czytamy, że panda jest zbudowana na zasadzie numpy, aby ułatwić jej stosowanie w aplikacjach NumPy-centric. – flyingmeatball