Python >> Tutoriel Python >  >> Python Tag >> Pandas

Un guide visuel de la fonction map ( ) Pandas

Les Pandas map( ) La fonction est utilisée pour mapper chaque valeur d'un objet Series à une autre valeur à l'aide d'un dictionnaire/fonction/Series. Il s'agit d'une fonction pratique pour mapper les valeurs d'une série d'un domaine à un autre domaine.

Fonction de carte Pandas

Regardons la documentation du map fonction,

  • map est une méthode Series - opérée au-dessus d'un objet Series.

Dans ce qui précède, pandas.Series.map prend un argument majeur, "arg".

Comme mentionné dans les paramètres ci-dessus, il existe 3 types différents d'espaces réservés possibles pour "arg". En termes simples, ils sont ;

  • Un dictionnaire
  • Une fonction
  • Une série indexée

Nous allons explorer en détail chacun des types d'arguments ci-dessus. Vous pouvez utiliser n'importe qui en fonction de votre cas d'utilisation.

Créons un DataFrame que nous pourrons utiliser plus loin dans le didacticiel pour explorer la fonction de carte. Les données dont nous disposons concernent 4 personnes ;

>>> import pandas as pd
>>> df = pd.DataFrame(
...         {
...             'Name': ['Edward', 'Natalie', 'Chris M', 'Priyatham'],
...             'Sex' : ['M', 'F', 'M', 'M'],
...             'Age': [45, 35, 29, 26],
...             'weight(kgs)': [68.4, 58.2, 64.3, 53.1]
...         }
...     )

>>>df
        Name Sex  Age  weight(kgs)
0     Edward   M   45         68.4
1    Natalie   F   35         58.2
2    Chris M   M   29         64.3
3  Priyatham   M   26         53.1

Pandas mappe le dictionnaire à la colonne

Chaque colonne du DataFrame est de type Series. Ainsi, nous pouvons mapper un dictionnaire à une colonne dans le DataFrame car la carte est une méthode Series.

Des différents types d'arguments possibles à la fonction map mentionnée ci-dessus, utilisons le type de dictionnaire dans cette section. En Machine Learning, les données que nous fournissons pour créer des modèles sont toujours sous forme numérique. Si vous observez le dtype de la colonne "Sexe" dans le DataFrame ci-dessous, il est de type String (objet).

>>> df['Sex']
0    M
1    F
2    M
3    M
Name: Sex, dtype: object

Toutes les valeurs des valeurs de la colonne "Sexe" sont l'une des deux valeurs discrètes - "M" ou "F". "M" représentant Homme et "F" représentant Femme. Nous ne pouvons pas fournir cette colonne pour construire un modèle d'apprentissage automatique car elle n'est pas de type numérique. Ainsi, le cas d'utilisation consiste à convertir cette colonne en un type numérique. Ce type de données est appelé « données catégorielles » dans la terminologie de l'apprentissage automatique.

Nous utiliserons la fonction map avec un argument de dictionnaire pour convertir la colonne "Sexe" en un type de données numérique. Ce processus de conversion de données catégorielles en données numériques est appelé « codage ». Comme nous n'avons que 2 catégories, ce processus d'encodage est appelé "Encodage binaire".

Le code pour cela est,

>>> df['Sex'].map({'F':1, 'M':0})
0    0
1    1
2    0
3    0
Name: Sex, dtype: int64

Si vous observez la série résultante ci-dessus, 'M' est mappé à 0 et 'F' est mappé à 1 en correspondance avec le dictionnaire.

Le processus ci-dessus de cartographie à l'aide d'un dictionnaire peut être visualisé à travers la vidéo animée suivante,

Pandas mappe la fonction à la colonne

Des différents types d'arguments possibles à la fonction map mentionnée ci-dessus, utilisons le type "Fonction" dans cette section. Obtenons les mêmes résultats que le mappage de dictionnaire ci-dessus en utilisant une fonction Python.

Nous devons d'abord lui créer une fonction. La fonction doit prendre toutes les valeurs de la colonne "Sexe" une par une et les convertir en nombres entiers respectifs.

>>> def sexInt(category):
...     if category=='M':
...         return 0
...     else:
...         return 1

Utilisons maintenant la fonction ci-dessus pour la mapper à la colonne "Sexe".

Le code pour cela est,

>>> df['Sex'].map(sexInt)
0    0
1    1
2    0
3    0
Name: Sex, dtype: int64

Le résultat ci-dessus est le même que celui de l'utilisation de l'argument du dictionnaire. Nous pouvons le vérifier par comparaison ;

>>> df['Sex'].map({'M':0, 'F':1}) == df['Sex'].map(sexInt)
0    True
1    True
2    True
3    True
Name: Sex, dtype: bool

D'après le résultat ci-dessus, vous pouvez voir que les deux résultats sont égaux.

Le processus ci-dessus de mappage à l'aide d'une fonction peut être visualisé à travers la vidéo animée suivante,

Les pandas mappent les séries aux valeurs des colonnes

Des différents types d'arguments possibles à la fonction map mentionnée ci-dessus, utilisons le type "Séries indexées" dans cette section. Les personnes de notre DataFrame sont prêtes à nous fournir leurs surnoms. Supposons que les surnoms sont fournis dans un objet Series. Nous aimerions mapper notre colonne "Name" du DataFrame aux surnoms. L'état est ;

  • L'index des séries de surnoms (appelés) doit être égal aux valeurs de la colonne "Nom" (appelant).

Construisons la colonne des surnoms ci-dessous avec la condition ci-dessus,

>>> nick_Name = pd.Series(['Ed', 'Nat', 'Chris', 'Priyatham'], index=df['Name'])
>>> nick_Name
Name
Edward              Ed
Natalie            Nat
Chris M          Chris
Priyatham    Priyatham
dtype: object

Associons la série créée ci-dessus à la colonne "Nom" du Datarame ;

Le code pour cela est,

>>> df['Name'].map(nick_Name)
0           Ed
1          Nat
2        Chris
3    Priyatham
Name: Name, dtype: object
  • Le principal point d'observation lors de l'application de la fonction de carte est :l'indice de l'indice de série résultant est égal à l'indice de l'appelant. Ceci est important car nous pouvons ajouter la série résultante à DataFrame en tant que colonne.

Ajoutons la série résultante en tant que colonne "nick_Name" au DataFrame,

>>> df['nick_Name'] = df['Name'].map(nick_Name)
>>> df
        Name Sex  Age  weight(kgs)  nick_Name
0     Edward   M   45         68.4         Ed
1    Natalie   F   35         58.2        Nat
2    Chris M   M   29         64.3      Chris
3  Priyatham   M   26         53.1  Priyatham

Le processus de mappage ci-dessus à l'aide d'une série indexée peut être visualisé à travers la vidéo animée suivante,

Les pandas mappent plusieurs colonnes

Chaque colonne d'un DataFrame est une série et la carte est une méthode de série. Ainsi, nous n'avons vu que mapper une seule colonne dans les sections ci-dessus à l'aide de la fonction de carte Pandas. Mais il existe des hacks dans Pandas pour faire fonctionner la fonction de carte pour plusieurs colonnes. Plusieurs colonnes combinées ensemble forment un DataFrame. Il existe un processus appelé empilement dans Pandas. "Empiler" crée une série de séries (colonnes) à partir d'un DataFrame. Ici, toutes les colonnes de DataFrame sont empilées en série pour former une autre série.

Nous avons encodé les valeurs "M" et "F" à 0 et 1 dans la section précédente. Lors de la création de modèles d'apprentissage automatique, il y a des chances que 1 soit interprété comme supérieur à 0 lors des calculs. Mais, ici ce sont 2 catégories différentes et non comparables.

Alors, stockons les données d'une manière différente dans notre DataFrame. Consacrons des colonnes séparées pour les hommes ("M") et les femmes ("F"). Et, nous pouvons remplir "Oui" et "Non" pour une personne en fonction de son sexe. Cela introduit la redondance des données mais résout notre problème discuté ci-dessus.

Cela peut être fait par le code suivant,

>>> df['Male'] = ['Yes', 'No', 'Yes', 'Yes']
>>> df['Female'] = ['No', 'Yes', 'No', 'No']
>>> df
        Name Sex  Age  weight(kgs)  nick_Name Male Female
0     Edward   M   45         68.4         Ed  Yes     No
1    Natalie   F   35         58.2        Nat   No    Yes
2    Chris M   M   29         64.3      Chris  Yes     No
3  Priyatham   M   26         53.1  Priyatham  Yes     No

Maintenant, nous allons mapper les 2 colonnes "Male" et "Female" aux valeurs numériques. Pour ce faire, nous devons prendre le sous-ensemble du DataFrame.

>>> df_subset = df[['Male', 'Female']]
>>> df_subset
  Male Female
0  Yes     No
1   No    Yes
2  Yes     No
3  Yes     No

Vous pouvez observer que nous avons un DataFrame de deux colonnes ci-dessus. Le point principal à noter est que les deux colonnes ont le même ensemble de valeurs possibles.

Par la suite, nous utiliserons le hack d'empilement et mapperons deux colonnes aux valeurs numériques. Cela peut être implémenté en utilisant le code suivant,

>>> df_subset.stack()
0  Male      Yes
   Female     No
1  Male       No
   Female    Yes
2  Male      Yes
   Female     No
3  Male      Yes
   Female     No
dtype: object

>>> df_subset.stack().map({'Yes':1, 'No':0})
0  Male      1
   Female    0
1  Male      0
   Female    1
2  Male      1
   Female    0
3  Male      1
   Female    0
dtype: int64

>>> df_subset.stack().map({'Yes':1, 'No':0}).unstack()
   Male  Female
0     1       0
1     0       1
2     1       0
3     1       0

Si vous observez le code et les résultats ci-dessus, le DataFrame est d'abord empilé pour former une série. Ensuite, la méthode de carte est appliquée à la série empilée. Enfin, le désempilage entraîne des valeurs numériques remplacées par DataFrame.

Dans Machine Learning, il existe des routines pour convertir une colonne de variable catégorielle en plusieurs colonnes numériques discrètes. Un tel processus d'encodage est appelé One-Hot Encoding dans la terminologie de l'apprentissage automatique.

Carte Pandas vs application

Nous avons discuté des Pandas apply fonction en détail dans un autre tutoriel. Le map et apply les fonctions présentent des différences majeures entre elles. Ils sont ;

  • La première différence est ;
    • map n'est qu'une méthode de série.
    • apply est à la fois la méthode Series et la méthode DataFrame.
  • La deuxième différence est ;
    • map prend dict / Series / function comme argument
    • apply prend la seule fonction comme argument
  • La troisième différence est ;
    • map est une opération élément par élément sur Series
    • apply est utilisé pour les opérations complexes au niveau des éléments sur Series et DataFrame
  • La quatrième différence est ;
    • map est principalement utilisé pour mapper des valeurs à l'aide d'un dictionnaire
    • apply est utilisé pour appliquer des fonctions qui ne sont pas disponibles en tant que routines d'agrégation vectorisées sur DataFrames

Conclusion et prochaines étapes

Une fonction de carte est principalement utilisée pour mapper les valeurs d'une série à l'aide d'un dictionnaire. Chaque fois que vous trouvez des données catégorielles, vous pouvez penser à une méthode cartographique pour les convertir en valeurs numériques. Si vous avez aimé ce tutoriel sur le map( ) et comme l'apprentissage basé sur des quiz, pensez à essayer de lire notre livre Coffee Break Pandas.