J'ai une trame de données dans les pandas où chaque colonne a une plage de valeurs différente. Par exemple:
df:
A B C
1000 10 0.5
765 5 0.35
800 7 0.09
Une idée comment je peux normaliser les colonnes de cette trame de données où chaque valeur est comprise entre 0 et 1?
Ma sortie souhaitée est:
A B C
1 1 1
0.765 0.5 0.7
0.8 0.7 0.18(which is 0.09/0.5)
ddof
argument?Réponses:
Vous pouvez utiliser le package sklearn et ses utilitaires de prétraitement associés pour normaliser les données.
Pour plus d'informations, consultez la documentation de scikit-learn sur le prétraitement des données: mise à l'échelle des fonctionnalités sur une plage.
la source
pd.DataFrame(min_max_scaler.fit_transform(df.T), columns=df.columns, index=df.index)
df=pandas.DataFrame(x_scaled, columns=df.columns)
un moyen simple en utilisant Pandas : (ici, je veux utiliser la normalisation moyenne)
pour utiliser la normalisation min-max:
Modifier: Pour répondre à certaines préoccupations, il faut dire que Pandas applique automatiquement la fonction par colonne dans le code ci-dessus.
la source
Basé sur ce post: /stats/70801/how-to-normalize-data-to-0-1-range
Vous pouvez effectuer les opérations suivantes:
Vous n'avez pas besoin de vous inquiéter de savoir si vos valeurs sont négatives ou positives. Et les valeurs doivent être bien réparties entre 0 et 1.
la source
Votre problème est en fait une simple transformation agissant sur les colonnes:
Ou encore plus laconique:
la source
lambda
un est le meilleur :-)axis [...] 0 or 'index': apply function to each column
. La valeur par défaut est en faitaxis=0
donc ce one-liner peut être écrit encore plus court :-) Merci @tschm.Si vous aimez utiliser le package sklearn, vous pouvez conserver les noms de colonne et d'index en utilisant des pandas
loc
comme ceci:la source
Le simple est beau:
la source
df["A"] = (df["A"]-df["A"].min()) / (df["A"].max()-df["A"].min())
df /= df.max()
- en supposant que l'objectif est de normaliser chaque colonne, individuellement.Vous pouvez créer une liste de colonnes que vous souhaitez normaliser
Votre cadre de données Pandas est désormais normalisé uniquement dans les colonnes que vous souhaitez
Cependant , si vous voulez le contraire , sélectionnez une liste de colonnes que vous ne voulez PAS normaliser, vous pouvez simplement créer une liste de toutes les colonnes et supprimer celles non souhaitées
la source
Je pense qu'une meilleure façon de le faire chez les pandas est juste
Modifier Si, dans votre bloc de données, des nombres négatifs sont présents, vous devez utiliser à la place
la source
La solution donnée par Sandman et Praveen est très bien. Le seul problème avec cela, si vous avez des variables catégorielles dans d'autres colonnes de votre bloc de données, cette méthode nécessitera quelques ajustements.
Ma solution à ce type de problème est la suivante:
la source
Exemple de différentes standardisations en python.
Pour référence, consultez cet article wikipedia: https://en.wikipedia.org/wiki/Unbias_estimation_of_standard_deviation
Exemples de données
Normalisation à l'aide de pandas (donne des estimations impartiales)
Lors de la normalisation, nous soustrayons simplement la moyenne et divisons par l'écart-type.
Normalisation à l'aide de sklearn (donne des estimations biaisées, différentes des pandas)
Si vous faites la même chose avec
sklearn
vous obtiendrez une sortie DIFFÉRENTE!Est-ce que les estimations biaisées de sklearn rendent l'apprentissage machine moins puissant?
NON.
La documentation officielle de sklearn.preprocessing.scale indique que l'utilisation d'un estimateur biaisé N'EST PAS PROBABLE pour affecter les performances des algorithmes d'apprentissage automatique et que nous pouvons les utiliser en toute sécurité.
Qu'en est-il de la mise à l'échelle MinMax?
Il n'y a pas de calcul d'écart type dans la mise à l'échelle MinMax. Le résultat est donc le même pour les pandas et pour scikit-learn.
la source
Vous voudrez peut-être que certaines colonnes soient normalisées et les autres inchangées, comme certaines tâches de régression dont les étiquettes de données ou les colonnes catégorielles sont inchangées.Je vous suggère donc cette méthode pythonique (c'est une combinaison de réponses @shg et @Cina):
la source
Ce ne sont que des mathématiques simples. La réponse devrait être aussi simple que ci-dessous.
la source
A partir du document de pandas, la structure DataFrame peut appliquer une opération (fonction) à elle-même.
Vous pouvez appliquer une fonction personnalisée pour faire fonctionner le DataFrame.
la source
La fonction suivante calcule le score Z:
la source
Voici comment procéder par colonne en utilisant la compréhension de liste:
la source
Vous pouvez simplement utiliser la fonction pandas.DataFrame.transform 1 de cette manière:
la source
la source
Vous pouvez le faire en une seule ligne
il prend la moyenne de chacune des colonnes, puis la soustrait (moyenne) de chaque ligne (moyenne de la colonne particulière soustrait de sa ligne uniquement) et divise par la moyenne uniquement. Enfin, nous obtenons l'ensemble de données normalisé.
la source
Pandas effectue la normalisation par colonne par défaut. Essayez le code ci-dessous.
Les valeurs de sortie seront comprises entre 0 et 1.
la source