Master Data Transformatie in Panda's met deze drie handige technieken

Een duik in filteren, manipuleren en functioneren

Foto door Milad Fakuriaan on Unsplash

Denk eens terug aan de laatste keer dat u met een mooi opgemaakte dataset werkte. Goed benoemde kolommen, minimale ontbrekende waarden en een goede organisatie. Het is een fijn gevoel โ€“ bijna bevrijdend โ€“ om gezegend te zijn met gegevens die je niet hoeft op te schonen en te transformeren.

Nou ja, het is leuk totdat je uit je dagdroom ontwaakt en verder gaat sleutelen aan de hopeloze puinhoop van kapotte rijen en onzinnige labels voor je.

Er bestaat niet zoiets als schone data (in de oorspronkelijke vorm). Als je een datawetenschapper bent, weet je dit. Als je net begint, moet je dit accepteren. Om er effectief mee te kunnen werken, moet u uw gegevens transformeren.

Laten we het hebben over drie manieren om dit te doen.

Filteren โ€” maar goed uitgelegd

Laten we het hebben over filteren, maar iets dieper dan u misschien gewend bent. Als een van de meest voorkomende en nuttige datatransformatiebewerkingen is effectief filteren een onmisbare vaardigheid voor elke datawetenschapper. Als je Pandaโ€™s kent, is dit waarschijnlijk een van de eerste handelingen die je hebt geleerd.

Laten we eens kijken aan de hand van mijn favoriete, vreemd veelzijdige voorbeeld: een DataFrame van leerlingcijfers, toepasselijk genoemd grades:

Afbeelding door auteur

We gaan alle scores onder de 90 eruit filteren, omdat we op deze dag besloten hebben slecht opgeleide docenten te zijn die zich alleen richten op de beste studenten (doe dit alsjeblieft nooit). De standaardcoderegel om dit te bereiken is als volgt:

cijfers[cijfers['Score'] >= 90]
Afbeelding door auteur

Dan blijven we bij Jack en Hermelien. Koel. Maar wat gebeurde hier precies? Waarom Werkt de bovenstaande regel code? Laten we wat dieper duiken door te kijken naar de uitvoer van de uitdrukking binnen de buitenste haakjes hierboven:

cijfers['Score'] >= 90
Afbeelding door auteur

AH oke. Dat is logisch. Het lijkt erop dat deze coderegel een Pandas Series-object retourneert dat Boolean ( True / False ) waarden bepaald door wat >= 90 geretourneerd voor elke afzonderlijke rij. Dit is de belangrijkste tussenstap. Daarna is het deze reeks Booleans die tussen de buitenste haakjes wordt geplaatst en alle rijen dienovereenkomstig worden gefilterd.

Ter vervollediging zal ik ook vermelden dat hetzelfde gedrag kan worden bereikt met behulp van de loc trefwoord:

cijfers.loc[cijfers['Score'] >= 90]
Afbeelding door auteur

Er zijn een aantal redenen waarom we ervoor kunnen kiezen om deze te gebruiken loc (waarvan er รฉรฉn is dat het ons feitelijk in staat stelt rijen en kolommen te filteren via een enkele bewerking), maar dat opent een Pandora's Box of Pandas-operatie die het beste aan een ander artikel kan worden overgelaten.

Voorlopig is het belangrijke leerdoel dit: wanneer we in Panda's filteren, is de verwarrende syntaxis niet een soort vreemde magie. We hoeven het eenvoudigweg op te splitsen in de twee samenstellende stappen: 1) het verkrijgen van een Booleaanse reeks van de rijen die aan onze voorwaarde voldoen, en 2) het gebruiken van de reeks om het volledige DataFrame eruit te filteren.

Waarom is dit nuttig, vraag je je misschien af? Over het algemeen zal het waarschijnlijk tot verwarrende bugs leiden als je alleen maar bewerkingen gebruikt zonder te begrijpen hoe ze eigenlijk werken. Filteren is een nuttige en ongelooflijk veel voorkomende handeling, en u weet nu hoe het werkt.

Laten we verder gaan.

De schoonheid van Lambda-functies

Soms vereisen uw gegevens transformaties die eenvoudigweg niet zijn ingebouwd in de functionaliteit van Pandas. Hoe u het ook probeert, geen enkele hoeveelheid doorspitten van Stack Overflow of het ijverig doorzoeken van de Pandas-documentatie onthult een oplossing voor uw probleem.

Voer lambda-functies in: een handige taalfunctie die prachtig integreert met Pandas.

Als een snel overzicht, hier is hoe lambda's werken:

>>> add_function = lambda x, y: x + y
>>> add_function(2, 3)
5

Lambda-functies verschillen niet van reguliere functies, behalve dat ze een beknoptere syntaxis hebben:

  • Functienaam links van het gelijkteken
  • De lambda trefwoord rechts van het gelijkteken (vergelijkbaar met de def trefwoord in een traditionele Python-functiedefinitie, dit laat Python weten dat we een functie definiรซren).
  • Parameter(s) na de lambda trefwoord, links van de dikke darm.
  • Retourwaarde rechts van de dubbele punt.

Laten we nu lambda-functies toepassen op een realistische situatie.

Datasets hebben vaak hun eigen opmaakkenmerken, specifiek voor variaties in gegevensinvoer en -verzameling. Als gevolg hiervan kunnen de gegevens waarmee u werkt, vreemde specifieke problemen hebben die u moet aanpakken. Kijk bijvoorbeeld eens naar de eenvoudige gegevensset hieronder, waarin de namen van mensen en hun inkomens zijn opgeslagen. Laten we het noemen monies.

Afbeelding door auteur

Nu hebben we, als Master Data Hoogheden van dit bedrijf, uiterst geheime informatie gekregen: iedereen in dit bedrijf krijgt een loonsverhoging van 10% plus nog eens $1000. Dit is waarschijnlijk een te specifieke berekening om een โ€‹โ€‹specifieke methode voor te vinden, maar eenvoudig genoeg met een lambda-functie:

update_income = lambda num: num + (num * .10) + 1000

Het enige wat we dan hoeven te doen is deze functie gebruiken met de Panda's apply functie, waarmee we een functie kunnen toepassen op elk element van de geselecteerde serie:

geld['Nieuw inkomen'] = geld['Inkomen'].apply(update_inkomen)
gelden
Afbeelding door auteur

En we zijn klaar! Een briljant nieuw DataFrame dat precies de informatie bevat die we nodig hadden, alles in twee regels code. Om het nog beknopter te maken, hadden we zelfs de lambdafunctie erin kunnen definiรซren apply direct โ€“ een leuke tip die het waard is om in gedachten te houden.

Ik zal het punt hier simpel houden.

Lambda's zijn buitengewoon nuttig en daarom moet u ze gebruiken. Genieten!

Serie String-manipulatiefuncties

In de vorige sectie hebben we gesproken over de veelzijdigheid van lambda-functies en alle leuke dingen die ze u kunnen helpen met uw gegevens te bereiken. Dit is geweldig, maar je moet oppassen dat je je niet laat meeslepen. Het komt ongelooflijk vaak voor dat je zo verstrikt raakt in รฉรฉn vertrouwde manier om dingen te doen, dat je de eenvoudigere snelkoppelingen mist waarmee Python programmeurs heeft gezegend. Dat geldt uiteraard voor meer dan alleen lambdaโ€™s, maar daar blijven we voorlopig bij.

Laten we bijvoorbeeld zeggen dat we het volgende DataFrame hebben aangeroepen names waarin de voor- en achternaam van mensen worden opgeslagen:

Afbeelding door auteur

Vanwege ruimtebeperkingen in onze database hebben we nu besloten dat het efficiรซnter is om simpelweg de laatste initiaal van een persoon op te slaan in plaats van de volledige achternaam van een persoon op te slaan. We moeten dus de transformatie transformeren 'Last Name' kolom dienovereenkomstig. Met lambdas zou onze poging daartoe er ongeveer als volgt uit kunnen zien:

namen['Achternaam'] = namen['Achternaam'].apply(lambda s: s[:1])
namen
Afbeelding door auteur

Dit werkt duidelijk, maar het is een beetje onhandig en daarom niet zo Pythonisch als het zou kunnen zijn. Gelukkig is er, met de schoonheid van de tekenreeksmanipulatiefuncties in Pandas, nog een andere, elegantere manier (voor het doel van de volgende regel code: ga gewoon door en neem aan dat we de tekenreeks nog niet hebben gewijzigd). 'Last Name' kolom met de bovenstaande code):

namen['Achternaam'] = namen['Achternaam'].str[:1]
namen
Afbeelding door auteur

Ta-da! De .str Met de eigenschap van een Pandas-serie kunnen we elke string in de serie splitsen met een gespecificeerde stringbewerking, net alsof we met elke string afzonderlijk zouden werken.

Maar wacht, het wordt beter. Sinds .str geeft ons effectief toegang tot de normale functionaliteit van een string via de serie, we kunnen ook een reeks stringfuncties toepassen om onze gegevens snel te verwerken! Stel dat we besluiten beide kolommen naar kleine letters te converteren. De volgende code doet het werk:

namen['Voornaam'] = namen['Voornaam'].str.lower()
namen['Achternaam'] = namen['Achternaam'].str.lower()
namen
Afbeelding door auteur

Veel eenvoudiger dan het gedoe van het definiรซren van uw eigen lambda-functies en het aanroepen van de string-functies daarin. Niet dat ik niet van lambda's houd, maar alles heeft zijn plaats, en eenvoud moet altijd prioriteit hebben in Python.

Ik heb hier slechts een paar voorbeelden besproken, maar een grote verzameling stringfuncties staat tot uw beschikking [1].

Gebruik ze royaal. Ze zijn uitstekend.

Laatste gedachten en samenvatting

Hier is een klein spiekbriefje voor gegevenstransformatie:

  1. Filter alsof je het meent. Ontdek wat er werkelijk aan de hand is, zodat u weet wat u doet.
  2. Ik ben dol op je lambda's. Ze kunnen u helpen gegevens op verbazingwekkende manieren te manipuleren.
  3. Panda's houden net zoveel van snaren als jij. Er is veel ingebouwde functionaliteit - u kunt deze net zo goed gebruiken.

Hier is nog een laatste advies: er is geen โ€˜juisteโ€™ manier om een โ€‹โ€‹dataset te filteren. Het hangt af van de beschikbare gegevens en van het unieke probleem dat u wilt oplossen. Hoewel er geen vaste methode is die u elke keer kunt volgen, is er wel een handige verzameling hulpmiddelen die de moeite waard zijn om tot uw beschikking te hebben. In dit artikel besprak ik er drie.

Ik moedig je aan om eropuit te gaan en nog meer te vinden.

Referenties

[1] https://www.aboutdatablog.com/post/10-most-useful-string-functions-in-pandas

Masterdata-transformatie in panda's met deze drie nuttige technieken, opnieuw gepubliceerd vanuit de bron 20699 via https://towardsdatascience.com/feed

<!โ€“

->

Tijdstempel:

Meer van Blockchain-adviseurs