Masterdatatransformasjon i pandaer med disse tre nyttige teknikkene

Et dykk i filtrering, manipulering og funksjon

Photo by Milad Fakurian on Unsplash

Tenk tilbake til forrige gang du jobbet med et pent formatert datasett. Velnavngitte kolonner, minimalt med manglende verdier og riktig organisering. Det er en fin følelse – nesten frigjørende – å være velsignet med data som du ikke trenger å rense og transformere.

Vel, det er fint inntil du knipser ut av dagdrømmen og fortsetter å tukle med det håpløse rotet av ødelagte rader og useriøse etiketter foran deg.

Det er ikke noe som heter rene data (i sin opprinnelige form). Hvis du er en dataforsker, vet du dette. Hvis du nettopp har begynt, bør du akseptere dette. Du må transformere dataene dine for å kunne jobbe effektivt med dem.

La oss snakke om tre måter å gjøre det på.

Filtrering - men forklart riktig

La oss snakke om filtrering - men litt dypere enn du kanskje er vant til å gjøre. Som en av de vanligste og mest nyttige datatransformasjonsoperasjonene, er effektiv filtrering en må-ha-ferdighet for enhver dataforsker. Hvis du kjenner Pandas, er det sannsynligvis en av de første operasjonene du lærte å gjøre.

La oss gå gjennom, ved å bruke mitt favoritt, merkelig allsidige eksempel: en DataFrame med studentkarakterer, passende kalt grades:

Bilde av forfatteren

Vi kommer til å filtrere ut eventuelle poengsummer under 90, fordi vi denne dagen har bestemt oss for å være dårlig trente lærere som kun henvender seg til de beste studentene (vær så snill å aldri gjør dette). Standardlinjen med kode for å oppnå dette er som følger:

karakterer[karakterer['Score'] >= 90]
Bilde av forfatteren

Det etterlater oss med Jack og Hermione. Kul. Men hva skjedde egentlig her? Hvorfor fungerer kodelinjen ovenfor? La oss dykke litt dypere ved å se på resultatet av uttrykket på innsiden av de ytre parentesene ovenfor:

karakterer['Score'] >= 90
Bilde av forfatteren

Ah, greit. Det gir mening. Det ser ut til at denne kodelinjen returnerer et Pandas Series-objekt som inneholder boolsk ( True / False ) verdier bestemt av hva >= 90 returneres for hver enkelt rad. Dette er det viktigste mellomtrinnet. Etterpå er det denne serien av boolere som sendes inn i de ytre parentesene, og filtrerer alle radene deretter.

For fullføringens skyld vil jeg også nevne at den samme oppførselen kan oppnås ved å bruke loc søkeord:

grades.loc[grades['Score'] >= 90]
Bilde av forfatteren

Det er flere grunner til at vi kan velge å bruke loc (en av dem er at den faktisk lar oss filtrere rader og kolonner gjennom en enkelt operasjon), men det åpner for en Pandoras boks med Pandas-operasjoner som best overlates til en annen artikkel.

Foreløpig er det viktige læringsmålet dette: når vi filtrerer i Pandas, er ikke den forvirrende syntaksen en slags merkelig magi. Vi trenger ganske enkelt å dele den ned i de to komponenttrinnene: 1) få en boolsk serie av radene som tilfredsstiller betingelsene våre, og 2) bruke serien til å filtrere ut hele DataFrame.

Hvorfor er dette nyttig, spør du kanskje? Vel, generelt sett vil det sannsynligvis føre til forvirrende feil hvis du bare bruker operasjoner uten å forstå hvordan de faktisk fungerer. Filtrering er en nyttig og utrolig vanlig operasjon, og du vet nå hvordan den fungerer.

La oss gå videre.

Skjønnheten med Lambda-funksjoner

Noen ganger krever dataene dine transformasjoner som rett og slett ikke er innebygd i funksjonaliteten til Pandas. Prøv som du kanskje, ingen mengde skuring av Stack Overflow eller flittig undersøkelse av Pandas-dokumentasjonen avslører en løsning på problemet ditt.

Gå inn i lambda-funksjoner — en nyttig språkfunksjon som integreres vakkert med pandaer.

Som en rask gjennomgang, her er hvordan lambdaer fungerer:

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

Lambda-funksjoner er ikke annerledes enn vanlige funksjoner, bortsett fra at de har en mer kortfattet syntaks:

  • Funksjonsnavn til venstre for likhetstegnet
  • De lambda nøkkelord til høyre for likhetstegnet (på samme måte som def nøkkelord i en tradisjonell Python-funksjonsdefinisjon, lar dette Python vite at vi definerer en funksjon).
  • Parameter(e) etter lambda nøkkelord, til venstre for kolon.
  • Returverdi til høyre for kolon.

La oss nå bruke lambda-funksjoner til en realistisk situasjon.

Datasett har ofte sine egne formateringsegenskaper, spesifikke for variasjoner i datainntasting og innsamling. Som et resultat kan dataene du jobber med ha merkelig spesifikke problemer som du må løse. Tenk for eksempel på det enkle datasettet nedenfor, som lagrer folks navn og inntekt. La oss kalle det monies.

Bilde av forfatteren

Nå, som dette selskapets Master Data Highnesses, har vi fått litt topphemmelig informasjon: alle i dette selskapet vil få en økning på 10 % pluss ytterligere $1000. Dette er sannsynligvis for spesifikk utregning til å finne en spesifikk metode for, men grei nok med en lambda-funksjon:

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

Da er alt vi trenger å gjøre å bruke denne funksjonen med Pandaene apply funksjon, som lar oss bruke en funksjon på hvert element i den valgte serien:

monies['New Income'] = penger['Income'].apply(update_income)
penger
Bilde av forfatteren

Og vi er ferdige! En strålende ny DataFrame som består av akkurat den informasjonen vi trengte, alt i to linjer med kode. For å gjøre det enda mer kortfattet, kunne vi til og med ha definert lambdafunksjonen inne i apply direkte — et kult tips verdt å huske på.

Jeg skal holde poenget her enkelt.

Lambdas er ekstremt nyttige, og derfor bør du bruke dem. Nyt!

Serie strengmanipulasjonsfunksjoner

I forrige seksjon snakket vi om allsidigheten til lambda-funksjoner og alle de kule tingene de kan hjelpe deg å oppnå med dataene dine. Dette er utmerket, men du bør være forsiktig så du ikke lar deg rive med. Det er utrolig vanlig å bli så fanget av én kjent måte å gjøre ting på at du går glipp av enklere snarveier Python har velsignet programmerere med. Dette gjelder selvsagt mer enn bare lambdaer, men vi holder oss til det for øyeblikket.

For eksempel, la oss si at vi har følgende DataFrame kalt names som lagrer folks for- og etternavn:

Bilde av forfatteren

Nå, på grunn av plassbegrensninger i databasen vår, bestemmer vi at i stedet for å lagre en persons hele etternavn, er det mer effektivt å bare lagre den siste initialen. Derfor må vi transformere 'Last Name' kolonne tilsvarende. Med lambdaer kan vårt forsøk på å gjøre det se omtrent slik ut:

names['Etternavn'] = navn['Etternavn'].apply(lambda s: s[:1])
navn
Bilde av forfatteren

Dette fungerer helt klart, men det er litt klønete, og derfor ikke så pytonisk som det kunne vært. Heldigvis, med skjønnheten til strengmanipulasjonsfunksjoner i Pandas, er det en annen, mer elegant måte (for den neste kodelinjen, bare gå videre og anta at vi ikke allerede har endret 'Last Name' kolonne med koden ovenfor):

names['Etternavn'] = navn['Etternavn'].str[:1]
navn
Bilde av forfatteren

Ta-da! De .str egenskapen til en Pandas-serie lar oss spleise hver streng i serien med en spesifisert strengoperasjon, akkurat som om vi jobbet med hver streng individuelt.

Men vent, det blir bedre. Siden .str gir oss effektivt tilgang til den normale funksjonaliteten til en streng gjennom serien, kan vi også bruke en rekke strengfunksjoner for å hjelpe til med å behandle dataene våre raskt! Si for eksempel at vi bestemmer oss for å konvertere begge kolonnene til små bokstaver. Følgende kode gjør jobben:

names['First Name'] = names['First Name'].str.lower()
names['Etternavn'] = navn['Etternavn'].str.lower()
navn
Bilde av forfatteren

Mye mer enkelt enn å gå gjennom bryet med å definere dine egne lambda-funksjoner og kalle strengfunksjonene inne i den. Ikke det at jeg ikke elsker lambdaer — men alt har sin plass, og enkelhet bør alltid prioriteres i Python.

Jeg har bare dekket noen få eksempler her, men en stor samling av strengfunksjoner er til din disposisjon [1].

Bruk dem rikelig. De er utmerket.

Siste tanker og oppsummering

Her er et lite jukseark for datatransformasjon for deg:

  1. Filtrer som du mener det. Lær hva som egentlig skjer slik at du vet hva du gjør.
  2. Elsker lambdaene dine. De kan hjelpe deg med å manipulere data på fantastiske måter.
  3. Pandas elsker strenger like mye som deg. Det er mye innebygd funksjonalitet - du kan like gjerne bruke den.

Her er et siste råd: det er ingen "riktig" måte å filtrere et datasett på. Det avhenger av dataene for hånden, så vel som det unike problemet du ønsker å løse. Men selv om det ikke er noen fast metode du kan følge hver gang, er det en nyttig samling verktøy som er verdt å ha til rådighet. I denne artikkelen diskuterte jeg tre av dem.

Jeg oppfordrer deg til å gå ut og finne noen flere.

Referanser

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

Masterdatatransformasjon i pandaer med disse tre nyttige teknikkene publisert på nytt fra kilde https://towardsdatascience.com/master-data-transformation-in-pandas-with-these-three-useful-techniques-20699f03e51d?source=rss—-7f60cf5620c9— 4 via https://towardsdatascience.com/feed

<!–

->

Tidstempel:

Mer fra Blockchain-konsulenter