C'est la première fois que j'utilise ColumnTransformer et je rencontre un problème avec la dimension du tableau.
Voici mon dataframe appelé 'concat_data':
StandardScaler().fit(concat_data[['Observation']])
J'essaie d'appliquer un scaler standard uniquement sur la colonne Observation avec le code suivant:
preprocessor = ColumnTransformer( transformers=[ ('num', StandardScaler(), ['Observation'])], remainder="passthrough") preprocessor.fit(concat_data, concat_data['Observation'])
Je reçois ce message d'erreur:
ValueError: données 1D transmises à un transformateur qui attend des données 2D. Essayer pour spécifier la sélection de colonne sous la forme d'une liste d'un élément au lieu d'un scalaire.
Je pourrais le faire sans ColumnTransformer mais mon objectif est de comprendre comment fonctionne ColumnTransformer. Par exemple, ce code fonctionne:
Date Hour Observation 0 01/09/2015 0 10 1 01/09/2015 1 9 2 01/09/2015 2 8 3 01/09/2015 3 10 4 01/09/2015 4 12
Merci à tous!
3 Réponses :
preprocessor.fit (concat_data, concat_data)
Peut également être utile: exemple d'utilisation du ColumnTransformer Dans un cas, vous avez toujours un Sortie [27]: pandas.core.frame.DataFrame Sortie [28]: pandas.core .series.Series La sortie pour les deux cas est également légèrement différente. preprocessor.fit (concat_data, concat_data [['Observation']])
À propos de l'utilisation de df ['A'] et df [['A']]
pd.DataFrame
- en utilisant df [['A']] , dans l'autre cas, il est pressé sur pd.Series
- df ['A']
. p> pd.Series
est considéré comme un objet 1D, car il est autorisé à avoir une colonne; pd.DataFrame
est un objet 2D, autorisé à avoir plusieurs colonnes et traité en conséquence. type(df['A'])
df = pd.DataFrame(data=[[1,2,3,4,5],[5,4,3,2,1]],index=[0,1],columns=['A','B','C','D','E'])
type(df[['A']])
Bien que votre explication sur la forme DataFrame
soit correcte, mais dans votre réponse, vous modifiez le deuxième paramètre, c'est-à-dire y
en 2D contre 1-d. y
est un paramètre facultatif, qui n'est pas requis par StandardScaler, donc également non utilisé par ColumnTransformer
même si vous y envoyez 2-d ou 1-d. Il ne sera pas utilisé et le problème n'est pas lié à cela.
Pourriez-vous s'il vous plaît étendre ce que vous voulez dire exactement? La question ne concerne pas le StandardScaler, mais plutôt le ColumnTransformer.
Oui. Mais lorsque vous dites essayer ceci
ou cela
, vous modifiez le deuxième paramètre d'entrée qui dans ColumnTransformer
est y
et optionnel. Donc, à moins que l'objet interne, (le StandardScaler
) l'utilise, il ne sera pas utilisé. Le problème OP ayant est pour la première entrée, à savoir X
. Donc vos suggestions ne sont pas pertinentes à cela
Artur Sokolovsky, j'ai aussi essayé l'exemple de scikit-learn et cela n'a pas fonctionné non plus
Comme Vivek Kumar l'a suggéré, le problème était dû à une ancienne version de scikit-learn. La mise à jour vers la version 0.20.02 a résolu le problème.
Vous devez utiliser preprocessor.fit (concat_data)
directement et cela fonctionnera, le ColumnTransformer
n'attend qu'un seul DataFrame
et non deux. Et il recherchera automatiquement la colonne Observation
Je ne suis pas en mesure de reproduire cela. Sur mon système, le code que vous avez publié fonctionne bien pour
ColumnTransformer
. L'erreur suggère d'utiliser une liste d'éléments uniques. Mais dans votre code, vous le faites déjà dans['Observation']
. Alors, êtes-vous sûr d'utiliser le même code? Essayez de mettre à jour la version de scikit-learn vers la dernière.