2017-06-19 1 views
1

J'utilise le code suivant pour normaliser une trame de données de pandas géants:Pandas: Ignorer les colonnes de chaîne tout en faisant la normalisation

df_norm = (df - df.mean())/(df.max() - df.min()) 

Cela fonctionne bien lorsque toutes les colonnes sont numériques. Cependant, maintenant j'ai quelques colonnes de chaîne dans df et la normalisation ci-dessus a des erreurs. Existe-t-il un moyen d'effectuer une telle normalisation uniquement sur les colonnes numériques d'une trame de données (en conservant la colonne de chaîne inchangée)? Merci!

Répondre

2

Vous pouvez utiliser select_dtypes pour calculer la valeur pour les colonnes souhaitées:

df = pd.DataFrame({'a': [1, 2, 3], 'b': ['a', 'b', 'c'], 'c': [4, 5, 6]}) 

df 

    a b c 
0 1 a 4 
1 2 b 5 
2 3 c 6 

df_num = df.select_dtypes(include=[np.number]) 

df_num 

    a c 
0 1 4 
1 2 5 
2 3 6 

Et vous pouvez les affecter revenir à la df d'origine:

df_norm = (df_num - df_num.mean())/(df_num.max() - df_num.min()) 


df[df_norm.columns] = df_norm 

df 

    a b c 
0 -0.5 a -0.5 
1 0.0 b 0.0 
2 0.5 c 0.5 
+0

n'a pas vu votre réponse comme je l'étais écrit le mien. Peut supprimer si nécessaire, pas sûr de ce que le protocole est. – LateCoder

+0

regardez ma réponse et adressez la seule lacune dans votre réponse. A savoir que vous pouvez couvrir tous les types numériques avec np.number. – piRSquared