Masterdatatransformation i pandor med dessa tre användbara tekniker

En dykning i filtrering, manipulering och funktion

Foto: Milad Fakurian on Unsplash

Tänk tillbaka på förra gången du arbetade med en snyggt formaterad datamängd. Välnamnda kolumner, minimala saknade värden och korrekt organisation. Det är en skön känsla – nästan befriande – att bli välsignad med data som du inte behöver rengöra och omvandla.

Tja, det är skönt tills du släpper din dagdröm och återupptar att mixtra med den hopplösa röran av trasiga rader och nonsensiga etiketter framför dig.

Det finns inget sådant som ren data (i sin ursprungliga form). Om du är en dataforskare vet du detta. Om du precis har börjat bör du acceptera detta. Du måste omvandla din data för att kunna arbeta effektivt med den.

Låt oss prata om tre sätt att göra det.

Filtrering - men korrekt förklarat

Låt oss prata om filtrering - men lite djupare än du kanske är van vid att göra. Som en av de vanligaste och mest användbara datatransformationsoperationerna är effektiv filtrering en måste-ha färdighet för alla dataforskare. Om du känner Pandas är det troligen en av de första operationerna du lärde dig att göra.

Låt oss granska, med hjälp av mitt favorit, konstigt mångsidiga exempel: en DataFrame med studentbetyg, passande kallad grades:

Bild av författare

Vi kommer att filtrera bort alla poäng under 90, för den här dagen har vi bestämt oss för att vara dåligt utbildade pedagoger som bara vänder sig till de bästa eleverna (snälla gör aldrig det här). Standardraden med kod för att åstadkomma detta är följande:

betyg[betyg['Betyg'] >= 90]
Bild av författare

Det lämnar oss med Jack och Hermione. Häftigt. Men vad exakt hände här? Varför fungerar ovanstående kodrad? Låt oss dyka lite djupare genom att titta på resultatet av uttrycket inuti de yttre parenteserna ovan:

betyg['Betyg'] >= 90
Bild av författare

Ah okej. Det känns logiskt. Det verkar som att denna kodrad returnerar ett Pandas Series-objekt som innehåller Boolean ( True / False ) värden bestäms av vad >= 90 returneras för varje enskild rad. Detta är det viktigaste mellansteget. Efteråt är det denna serie av booleaner som skickas in i de yttre parenteserna och filtrerar alla rader därefter.

För kompletteringens skull kommer jag också att nämna att samma beteende kan uppnås med hjälp av loc nyckelord:

grades.loc[grades['Poäng'] >= 90]
Bild av författare

Det finns ett antal anledningar till att vi kan välja att använda loc (varav en är att det faktiskt tillåter oss att filtrera rader och kolumner genom en enda operation), men det öppnar upp en Pandoras Box of Pandas operationer som bäst lämnas till en annan artikel.

För nu är det viktiga inlärningsmålet detta: när vi filtrerar i Pandas är den förvirrande syntaxen inte någon form av konstig magi. Vi behöver helt enkelt dela upp den i dess två komponentsteg: 1) få en boolesk serie av raderna som uppfyller vårt villkor, och 2) använda serien för att filtrera bort hela DataFrame.

Varför är detta användbart, kanske du frågar? Tja, generellt sett kommer det sannolikt att leda till förvirrande buggar om du bara använder operationer utan att förstå hur de faktiskt fungerar. Filtrering är en användbar och otroligt vanlig operation, och du vet nu hur det fungerar.

Låt oss gå vidare.

Skönheten med lambdafunktioner

Ibland kräver dina data transformationer som helt enkelt inte är inbyggda i Pandas funktionalitet. Försök som du kan, ingen mängd skurande Stack Overflow eller flitigt utforskande av Pandas-dokumentationen avslöjar en lösning på ditt problem.

Ange lambda-funktioner — en användbar språkfunktion som integreras vackert med pandor.

Som en snabb recension, så här fungerar lambdas:

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

Lambdafunktioner skiljer sig inte från vanliga funktioner, förutom det faktum att de har en mer koncis syntax:

  • Funktionsnamn till vänster om likhetstecknet
  • Smakämnen lambda nyckelord till höger om likhetstecknet (på samma sätt som def nyckelord i en traditionell Python-funktionsdefinition låter detta Python veta att vi definierar en funktion).
  • Parameter(er) efter lambda nyckelord, till vänster om kolon.
  • Returvärde till höger om kolon.

Låt oss nu tillämpa lambdafunktioner på en realistisk situation.

Datauppsättningar har ofta sina egna formateringsegenskaper, specifika för variationer i datainmatning och insamling. Som ett resultat kan informationen du arbetar med ha konstigt specifika problem som du behöver åtgärda. Tänk till exempel på den enkla datamängden nedan, som lagrar människors namn och deras inkomster. Låt oss kalla det monies.

Bild av författare

Nu, som detta företags Master Data Highnesses, har vi fått lite topphemlig information: alla i det här företaget kommer att få en höjning på 10 % plus ytterligare 1000 $. Detta är förmodligen en för specifik beräkning för att hitta en specifik metod för, men okomplicerad nog med en lambdafunktion:

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

Sedan behöver vi bara använda den här funktionen med Pandas apply funktion, som låter oss tillämpa en funktion på varje element i den valda serien:

pengar['New Income'] = pengar['Income'].apply(update_income)
pengar
Bild av författare

Och vi är klara! En briljant ny DataFrame som består av exakt den information vi behövde, allt i två rader kod. För att göra det ännu mer kortfattat kunde vi till och med ha definierat lambdafunktionen inuti apply direkt — ett coolt tips värt att ha i åtanke.

Jag ska hålla poängen här enkel.

Lambdas är extremt användbara, och därför bör du använda dem. Njut av!

Serie stränghanteringsfunktioner

I föregående avsnitt pratade vi om lambdafunktionernas mångsidighet och alla coola saker som de kan hjälpa dig att åstadkomma med din data. Detta är utmärkt, men du ska vara försiktig så att du inte blir medtagen. Det är otroligt vanligt att fastna i ett välbekant sätt att göra saker på att man går miste om enklare genvägar som Python har välsignat programmerare med. Det här gäller såklart mer än bara lambda, men vi håller oss till det för stunden.

Låt oss till exempel säga att vi har följande DataFrame kallad names som lagrar personers för- och efternamn:

Bild av författare

Nu, på grund av utrymmesbegränsningar i vår databas, beslutar vi att istället för att lagra en persons hela efternamn, är det mer effektivt att helt enkelt lagra deras sista initial. Därför måste vi omvandla 'Last Name' kolumn i enlighet med detta. Med lambdas kan vårt försök att göra det se ut ungefär så här:

names['Efternamn'] = namn['Efternamn'].apply(lambda s: s[:1])
namn
Bild av författare

Detta fungerar helt klart, men det är lite klumpigt och därför inte så pytoniskt som det skulle kunna vara. Lyckligtvis, med skönheten med strängmanipuleringsfunktioner i Pandas, finns det ett annat, mer elegant sätt (för nästa rad kod, fortsätt bara och anta att vi inte redan har ändrat 'Last Name' kolumn med ovanstående kod):

names['Efternamn'] = namn['Efternamn'].str[:1]
namn
Bild av författare

Ta-da! De .str egenskapen för en Pandas-serie låter oss skarva varje sträng i serien med en specificerad strängoperation, precis som om vi skulle arbeta med varje sträng individuellt.

Men vänta, det blir bättre. Eftersom .str ger oss effektivt tillgång till en strängs normala funktionalitet genom serien, vi kan också använda en rad strängfunktioner för att hjälpa till att bearbeta vår data snabbt! Säg till exempel att vi bestämmer oss för att konvertera båda kolumnerna till gemener. Följande kod gör jobbet:

names['First Name'] = names['First Name'].str.lower()
names['Efternamn'] = namn['Efternamn'].str.lower()
namn
Bild av författare

Mycket enklare än att gå igenom besväret med att definiera dina egna lambdafunktioner och kalla strängfunktionerna inuti den. Inte för att jag inte älskar lambdas — men allt har sin plats, och enkelhet bör alltid ha prioritet i Python.

Jag har bara tagit upp några exempel här, men en stor samling strängfunktioner står till ditt förfogande [1].

Använd dem frikostigt. De är utmärkta.

Slutliga tankar och sammanfattning

Här är ett litet fuskblad för datatransformation för dig:

  1. Filtrera som du menar det. Lär dig vad som verkligen händer så att du vet vad du gör.
  2. Älskar dina lambdas. De kan hjälpa dig att manipulera data på fantastiska sätt.
  3. Pandas älskar strängar lika mycket som du gör. Det finns en hel del inbyggd funktionalitet - du kan lika gärna använda den.

Här är ett sista råd: det finns inget "korrekt" sätt att filtrera en datamängd. Det beror på data till hands samt det unika problem du vill lösa. Men även om det inte finns någon fast metod du kan följa varje gång, finns det en användbar samling verktyg som är värda att ha till ditt förfogande. I den här artikeln diskuterade jag tre av dem.

Jag uppmuntrar dig att gå ut och hitta några fler.

Referensprojekt

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

Masterdatatransformation i pandor med dessa tre användbara tekniker återpublicerade från källa https://towardsdatascience.com/master-data-transformation-in-pandas-with-these-three-useful-techniques-20699f03e51d?source=rss—-7f60cf5620c9— 4 via https://towardsdatascience.com/feed

<!–

->

Tidsstämpel:

Mer från Blockchain-konsulter