Repensez à la dernière fois que vous avez travaillé avec un ensemble de données bien formaté. Colonnes bien nommées, valeurs manquantes minimales et organisation appropriée. C’est un sentiment agréable – presque libérateur – d’être béni avec des données que vous n’avez pas besoin de nettoyer et de transformer.
Eh bien, c’est bien jusqu’à ce que vous sortiez de votre rêverie et que vous repreniez à bricoler le fouillis désespéré de rangées brisées et d’étiquettes absurdes devant vous.
Les données propres (dans leur forme originale) n’existent pas. Si vous êtes un data scientist, vous le savez. Si vous débutez, vous devez accepter cela. Vous devrez transformer vos données afin de les exploiter efficacement.
Parlons de trois façons de le faire.
Filtrage – mais expliqué correctement
Parlons du filtrage, mais un peu plus en profondeur que ce à quoi vous êtes habitué. En tant que l’une des opérations de transformation de données les plus courantes et les plus utiles, le filtrage efficace est une compétence indispensable pour tout scientifique des données. Si vous connaissez Pandas, c’est probablement l’une des premières opérations que vous avez appris à faire.
Passons en revue, en utilisant mon exemple préféré, étrangement polyvalent : un DataFrame de notes d’étudiants, appelé à juste titregrades
:

Nous allons filtrer tous les scores inférieurs à 90, car ce jour-là, nous avons décidé d’être des éducateurs mal formés qui ne s’adressent qu’aux meilleurs élèves (s’il vous plaît, ne faites jamais cela). La ligne de code standard pour y parvenir est la suivante :
notes[notes['Score'] >= 90]

Cela nous laisse avec Jack et Hermione. Cool. Mais que s’est-il exactement passé ici ? Pourquoi la ligne de code ci-dessus fonctionne-t-elle ? Plongeons un peu plus en regardant la sortie de l’expression à l’intérieur des crochets extérieurs ci-dessus :
notes['Score'] >= 90

Ah ok. Ça a du sens. Il semble que cette ligne de code renvoie un objet Pandas Series qui contient des valeurs booléennes ( True
/ False
) déterminées par ce qui <row_score> >= 90
est renvoyé pour chaque ligne individuelle. C’est l’étape intermédiaire clé. Ensuite, c’est cette série de booléens qui est passée dans les crochets extérieurs et filtre toutes les lignes en conséquence.
Par souci d’achèvement, je mentionnerai également que le même comportement peut être obtenu en utilisant le loc
mot-clé :
notes.loc[notes['Score'] >= 90]

Il y a un certain nombre de raisons que nous pourrions choisir d’utiliser loc
(dont l’une est que cela nous permet en fait de filtrer les lignes et les colonnes en une seule opération), mais cela ouvre une boîte de Pandore des opérations Pandas qu’il vaut mieux laisser à un autre article.
Pour l’instant, l’objectif d’apprentissage important est le suivant : lorsque nous filtrons dans Pandas, la syntaxe déroutante n’est pas une sorte de magie étrange. Nous devons simplement le décomposer en deux étapes : 1) obtenir une série booléenne des lignes qui satisfont à notre condition, et 2) utiliser la série pour filtrer l’ensemble du DataFrame.
Pourquoi est-ce utile, pourriez-vous demander? Eh bien, d’une manière générale, cela risque de conduire à des bogues déroutants si vous utilisez simplement des opérations sans comprendre comment elles fonctionnent réellement. Le filtrage est une opération utile et incroyablement courante, et vous savez maintenant comment cela fonctionne.
Allons-nous en.
La beauté des fonctions Lambda
Parfois, vos données nécessitent des transformations qui ne sont tout simplement pas intégrées aux fonctionnalités de Pandas. Essayez comme vous pourriez, aucune quantité de récurer Stack Overflow ou d’explorer avec diligence la documentation de Pandas ne révèle une solution à votre problème.
Entrez dans les fonctions lambda – une fonctionnalité de langage utile qui s’intègre parfaitement à Pandas.
En bref, voici comment fonctionnent les lambdas :
>>> add_function = lambda x, y : x + y
>>> add_function(2, 3)
5
Les fonctions Lambda ne sont pas différentes des fonctions régulières, à l’exception du fait qu’elles ont une syntaxe plus concise :
- Nom de la fonction à gauche du signe égal.
- Le
lambda
mot-clé à droite du signe égal (similaire audef
mot-clé dans une définition de fonction Python traditionnelle, cela permet à Python de savoir que nous définissons une fonction). - Paramètre(s) après le
lambda
mot-clé, à gauche des deux-points. - Renvoie la valeur à droite des deux-points.
Maintenant, appliquons les fonctions lambda à une situation réaliste.
Les ensembles de données ont souvent leurs propres bizarreries de formatage, spécifiques aux variations dans la saisie et la collecte des données. Par conséquent, les données avec lesquelles vous travaillez peuvent présenter des problèmes étrangement spécifiques que vous devez résoudre. Par exemple, considérez l’ensemble de données simple ci-dessous, qui stocke les noms des personnes et leurs revenus. Appelons-le monies
.

Maintenant, en tant que Master Data Highnesses de cette entreprise, nous avons reçu des informations top secrètes : tout le monde dans cette entreprise recevra une augmentation de 10 % plus 1 000 $ supplémentaires. C’est probablement trop spécifique d’un calcul pour trouver une méthode spécifique, mais assez simple avec une fonction lambda :
update_ income = lambda num : num + (num * .10) + 1000
Ensuite, il suffit d’utiliser cette fonction avec la apply
fonction Pandas, qui permet d’appliquer une fonction à chaque élément de la Série sélectionnée :
argents['Nouveau revenu'] = argents['Revenu'].apply(update_ income)
argents

Et nous avons terminé ! Un nouveau DataFrame brillant composé exactement des informations dont nous avions besoin, le tout en deux lignes de code. Pour le rendre encore plus concis, nous aurions même pu définir apply
directement la fonction lambda à l’intérieur de – une astuce intéressante à garder à l’esprit.
Je vais garder le point ici simple.
Les lambdas sont extrêmement utiles et vous devez donc les utiliser. Apprécier!
Fonctions de manipulation de chaînes en série
Dans la section précédente, nous avons parlé de la polyvalence des fonctions lambda et de toutes les choses intéressantes qu’elles peuvent vous aider à accomplir avec vos données. C’est excellent, mais il faut faire attention à ne pas s’emballer. Il est incroyablement courant d’être tellement pris dans une façon familière de faire les choses que vous manquez des raccourcis plus simples avec lesquels Python a béni les programmeurs. Cela s’applique à plus que les lambdas, bien sûr, mais nous nous en tiendrons à cela pour le moment.
Par exemple, disons que nous avons le DataFrame suivant appelé names
qui stocke les noms et prénoms des personnes :

Maintenant, en raison des limitations d’espace dans notre base de données, nous décidons qu’au lieu de stocker le nom de famille complet d’une personne, il est plus efficace de stocker simplement sa dernière initiale. Ainsi, nous devons transformer la 'Last Name'
colonne en conséquence. Avec les lambdas, notre tentative pourrait ressembler à ceci :
names['Last Name'] = names['Last Name'].apply(lambda s: s[:1])
names

Cela fonctionne clairement, mais c’est un peu maladroit, et donc pas aussi Pythonic qu’il pourrait l’être. Heureusement, avec la beauté des fonctions de manipulation de chaînes dans Pandas, il existe un autre moyen plus élégant (pour les besoins de la prochaine ligne de code, continuez et supposez que nous n’avons pas déjà modifié la colonne 'Last Name'
avec le code ci-dessus) :
names['Last Name'] = names['Last Name'].str[:1]
noms

Ta-da ! La .str
propriété d’une série Pandas nous permet d’épisser chaque chaîne de la série avec une opération de chaîne spécifiée, comme si nous travaillions avec chaque chaîne individuellement.
Mais attendez, il ya mieux. Puisque .str
nous permet effectivement d’accéder à la fonctionnalité normale d’une chaîne via la série, nous pouvons également appliquer une gamme de fonctions de chaîne pour aider à traiter nos données rapidement ! Par exemple, disons que nous décidons de convertir les deux colonnes en minuscules. Le code suivant fait le travail :
names['First Name'] = names['First Name'].str.lower()
names['Last Name'] = names['Last Name'].str.lower()
names

Beaucoup plus simple que de passer par les tracas de définir vos propres fonctions lambda et d’appeler les fonctions de chaîne à l’intérieur de celle-ci. Non pas que je n’aime pas les lambdas — mais tout a sa place, et la simplicité devrait toujours avoir la priorité en Python.
Je n’ai couvert que quelques exemples ici, mais une grande collection de fonctions de chaîne est à votre disposition [1].
Utilisez-les généreusement. Ils sont excellents.
Réflexions finales et récapitulation
Voici un petit aide-mémoire sur la transformation des données :
- Filtrez comme vous l’entendez . Apprenez ce qui se passe réellement pour savoir ce que vous faites.
- Aimez vos lambdas . Ils peuvent vous aider à manipuler les données de manière étonnante.
- Les pandas aiment les cordes autant que vous . Il y a beaucoup de fonctionnalités intégrées – vous pouvez aussi bien les utiliser.
Voici un dernier conseil : il n’y a pas de méthode « correcte » pour filtrer un ensemble de données. Cela dépend des données disponibles ainsi que du problème unique que vous cherchez à résoudre. Cependant, bien qu’il n’y ait pas de méthode définie que vous puissiez suivre à chaque fois, il existe une collection utile d’outils à votre disposition. Dans cet article, j’en ai évoqué trois.