Voglio applicare il ridimensionamento (usando StandardScaler() da sklearn.preprocessing) ad un dataframe panda. Il seguente codice restituisce una matrice numpy, quindi perdo tutti i nomi delle colonne e gli indeces. Questo non è quello che voglio.Come utilizzare sklearn fit_transform con i panda e restituire dataframe invece di matrice numpy?
features = df[["col1", "col2", "col3", "col4"]]
autoscaler = StandardScaler()
features = autoscaler.fit_transform(features)
"soluzione" Un ho trovato on-line è:
features = features.apply(lambda x: autoscaler.fit_transform(x))
E sembra funzionare, ma conduce ad un DeprecationWarning:
/usr/lib/python3.5/site -packages/sklearn/preelaborazione/data.py: 583: DeprecationWarning: Passaggio array 1d come dati è obsoleto in 0,17 e solleverà ValueError a 0.19. Rimodellare i dati sia utilizzando X.reshape (-1, 1) se i dati ha una sola caratteristica o X.reshape (1, -1) se contiene un singolo campione.
pertanto provato:
features = features.apply(lambda x: autoscaler.fit_transform(x.reshape(-1, 1)))
Ma questo dà:
Traceback (chiamata più recente scorso): File "./analyse.py", la linea 91, in caratteristiche = features.apply (lambda x: autoscaler.fit_transform (x.reshape (-1, 1))) file "/usr/lib/python3.5/site-packages/pandas/core/frame.py", linea 3972, in si applica return self._apply_standard (f, axis, reduce = reduce) File "/usr/lib/python3.5/site-packages/pandas/core/frame.py", riga 4081, in _apply_standard result = self._constructor (dati = risultati, indice = indice) File "/usr/lib/python3.5/site-packages/pandas/core/frame.py", riga 226, in init mgr = self._init_dict (dati, index, columns, dtype = dtype) File "/usr/lib/python3.5/site-packages/pandas/core/frame.py", riga 363, in _init_dict dtype = dtype) File "/ usr/lib/python3.5/site-packages/pandas/core/frame.py ", riga 5163, in _arrays_to_mgr array = _homogenize (array, indice, dtype) File" /usr/lib/python3.5/site-packages/pandas /core/frame.py ", riga 5477, in _homogenize raise_cast_failure = False) File "/usr/lib/python3.5/site-packages/pandas/core/series.py", riga 2885, in _sanitize_array raise Exception ('I dati devono essere 1-dimensionali') Eccezione: i dati devono essere 1-dimensionali
Come si applica il ridimensionamento al dataframe panda, lasciando intatto il dataframe? Senza copiare i dati, se possibile.
Grazie per la risposta, ma il problema è che le righe vengono rinumerate quando il nuovo dataframe viene creato dall'array. Il dataframe originale non contiene righe numerate consecutivamente perché alcune di esse sono state rimosse. Suppongo di poter aggiungere anche una parola chiave index = [...] con i vecchi valori di indice. Se aggiorni la tua risposta di conseguenza, posso accettarla. – louic
Spero che la modifica aiuti, penso che la tua intuizione sull'impostazione dei valori dell'indice dal primo df sia corretta. I numeri che ho usato sono consecutivi ... (volevo solo mostrare che puoi resettarli a qualsiasi cosa e la gamma (10,20) era la migliore che potessi pensare, ma funzionerà con qualsiasi indice casuale sul df originale .HHH! – Kevin
Grazie mille Kevin! – louic