18 KiB
Arbeide med data: Datapreparering
![]() |
---|
Datapreparering - Sketchnote av @nitya |
Quiz før forelesning
Avhengig av kilden kan rådata inneholde noen inkonsistenser som skaper utfordringer i analyse og modellering. Med andre ord kan disse dataene kategoriseres som "skitne" og må rengjøres. Denne leksjonen fokuserer på teknikker for å rense og transformere data for å håndtere utfordringer som manglende, unøyaktige eller ufullstendige data. Temaene som dekkes i denne leksjonen bruker Python og Pandas-biblioteket og vil bli demonstrert i notatboken i denne katalogen.
Viktigheten av å rense data
-
Enkel bruk og gjenbruk: Når data er riktig organisert og normalisert, blir det enklere å søke, bruke og dele med andre.
-
Konsistens: Dataanalyse krever ofte arbeid med flere datasett, der datasett fra ulike kilder må kombineres. Å sikre at hvert enkelt datasett har felles standardisering vil sørge for at dataene fortsatt er nyttige når de kombineres til ett datasett.
-
Modellnøyaktighet: Rensede data forbedrer nøyaktigheten til modellene som er avhengige av dem.
Vanlige mål og strategier for datarensing
-
Utforske et datasett: Datautforskning, som dekkes i en senere leksjon, kan hjelpe deg med å oppdage data som må renses. Visuell observasjon av verdier i et datasett kan gi forventninger om hvordan resten av det vil se ut, eller gi en idé om problemer som kan løses. Utforskning kan innebære grunnleggende spørringer, visualiseringer og prøvetaking.
-
Formatering: Avhengig av kilden kan data ha inkonsistenser i hvordan de presenteres. Dette kan skape problemer med å søke etter og representere verdier, der de er synlige i datasettet, men ikke riktig representert i visualiseringer eller spørringsresultater. Vanlige formateringsproblemer involverer å løse mellomrom, datoer og datatyper. Å løse formateringsproblemer er vanligvis opp til de som bruker dataene. For eksempel kan standarder for hvordan datoer og tall presenteres variere fra land til land.
-
Duplikasjoner: Data som forekommer mer enn én gang kan gi unøyaktige resultater og bør vanligvis fjernes. Dette kan være en vanlig forekomst når man kombinerer to eller flere datasett. Imidlertid finnes det tilfeller der duplisering i kombinerte datasett inneholder deler som kan gi tilleggsinformasjon og kanskje må bevares.
-
Manglende data: Manglende data kan føre til unøyaktigheter samt svake eller skjeve resultater. Noen ganger kan dette løses ved å "laste inn" dataene på nytt, fylle inn de manglende verdiene med beregninger og kode som Python, eller bare fjerne verdien og tilhørende data. Det finnes mange grunner til at data kan mangle, og handlingene som tas for å løse disse manglende verdiene kan avhenge av hvordan og hvorfor de manglet i utgangspunktet.
Utforske informasjon i DataFrame
Læringsmål: Etter denne delen skal du være komfortabel med å finne generell informasjon om data lagret i pandas DataFrames.
Når du har lastet inn dataene dine i pandas, vil de mest sannsynlig være i en DataFrame (se den forrige leksjonen for en detaljert oversikt). Men hvis datasettet i din DataFrame har 60 000 rader og 400 kolonner, hvordan begynner du å få en forståelse av hva du jobber med? Heldigvis gir pandas noen praktiske verktøy for raskt å se generell informasjon om en DataFrame i tillegg til de første og siste radene.
For å utforske denne funksjonaliteten, vil vi importere Python-biblioteket scikit-learn og bruke et ikonisk datasett: Iris-datasettet.
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
iris_df = pd.DataFrame(data=iris['data'], columns=iris['feature_names'])
sepal lengde (cm) | sepal bredde (cm) | petal lengde (cm) | petal bredde (cm) | |
---|---|---|---|---|
0 | 5.1 | 3.5 | 1.4 | 0.2 |
1 | 4.9 | 3.0 | 1.4 | 0.2 |
2 | 4.7 | 3.2 | 1.3 | 0.2 |
3 | 4.6 | 3.1 | 1.5 | 0.2 |
4 | 5.0 | 3.6 | 1.4 | 0.2 |
- DataFrame.info: For å begynne, brukes
info()
-metoden til å skrive ut en oppsummering av innholdet i enDataFrame
. La oss se på dette datasettet for å se hva vi har:
iris_df.info()
RangeIndex: 150 entries, 0 to 149
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal length (cm) 150 non-null float64
1 sepal width (cm) 150 non-null float64
2 petal length (cm) 150 non-null float64
3 petal width (cm) 150 non-null float64
dtypes: float64(4)
memory usage: 4.8 KB
Fra dette vet vi at Iris-datasettet har 150 oppføringer i fire kolonner uten nullverdier. Alle dataene er lagret som 64-biters flyttall.
- DataFrame.head(): Deretter, for å sjekke det faktiske innholdet i
DataFrame
, bruker vihead()
-metoden. La oss se hva de første radene i våriris_df
ser ut som:
iris_df.head()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
- DataFrame.tail(): For å sjekke de siste radene i
DataFrame
, bruker vitail()
-metoden:
iris_df.tail()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
Oppsummering: Bare ved å se på metadataene om informasjonen i en DataFrame eller de første og siste verdiene, kan du få en umiddelbar idé om størrelsen, formen og innholdet i dataene du jobber med.
Håndtering av manglende data
Læringsmål: Etter denne delen skal du vite hvordan du erstatter eller fjerner nullverdier fra DataFrames.
Ofte har datasettene du ønsker å bruke (eller må bruke) manglende verdier. Hvordan manglende data håndteres innebærer subtile avveininger som kan påvirke din endelige analyse og virkelige resultater.
Pandas håndterer manglende verdier på to måter. Den første har du sett før i tidligere seksjoner: NaN
, eller Not a Number. Dette er faktisk en spesiell verdi som er en del av IEEE-flyttallspesifikasjonen og brukes kun til å indikere manglende flyttallsverdier.
For manglende verdier som ikke er flyttall, bruker pandas Python-objektet None
. Selv om det kan virke forvirrende at du vil møte to forskjellige typer verdier som i hovedsak sier det samme, er det gode programmatiske grunner for dette designvalget, og i praksis gir denne tilnærmingen pandas en god balanse for de aller fleste tilfeller. Likevel har både None
og NaN
begrensninger som du må være oppmerksom på med hensyn til hvordan de kan brukes.
Les mer om NaN
og None
fra notatboken!
- Oppdage nullverdier: I
pandas
erisnull()
ognotnull()
dine primære metoder for å oppdage nullverdier. Begge returnerer boolske masker over dataene dine. Vi vil brukenumpy
forNaN
-verdier:
import numpy as np
example1 = pd.Series([0, np.nan, '', None])
example1.isnull()
0 False
1 True
2 False
3 True
dtype: bool
Se nøye på utdataene. Er noe av det overraskende? Selv om 0
er en aritmetisk null, er det likevel et heltall og pandas behandler det som sådan. ''
er litt mer subtilt. Selv om vi brukte det i seksjon 1 for å representere en tom strengverdi, er det likevel et strengobjekt og ikke en representasjon av null i pandas.
Nå, la oss snu dette rundt og bruke disse metodene på en måte som ligner mer på hvordan du vil bruke dem i praksis. Du kan bruke boolske masker direkte som en Series
eller DataFrame
-indeks, noe som kan være nyttig når du prøver å jobbe med isolerte manglende (eller tilstedeværende) verdier.
Oppsummering: Både
isnull()
ognotnull()
gir lignende resultater når du bruker dem iDataFrame
s: de viser resultatene og indeksen til disse resultatene, noe som vil hjelpe deg enormt når du jobber med dataene dine.
- Fjerne nullverdier: Utover å identifisere manglende verdier, gir pandas en praktisk måte å fjerne nullverdier fra
Series
ogDataFrame
s. (Spesielt for store datasett er det ofte mer tilrådelig å bare fjerne manglende [NA] verdier fra analysen din enn å håndtere dem på andre måter.) For å se dette i praksis, la oss gå tilbake tilexample1
:
example1 = example1.dropna()
example1
0 0
2
dtype: object
Merk at dette bør se ut som utdataene fra example3[example3.notnull()]
. Forskjellen her er at, i stedet for bare å indeksere på de maskerte verdiene, har dropna
fjernet de manglende verdiene fra Series
example1
.
Siden DataFrame
s har to dimensjoner, gir de flere alternativer for å fjerne data.
example2 = pd.DataFrame([[1, np.nan, 7],
[2, 5, 8],
[np.nan, 6, 9]])
example2
0 | 1 | 2 | |
---|---|---|---|
0 | 1.0 | NaN | 7 |
1 | 2.0 | 5.0 | 8 |
2 | NaN | 6.0 | 9 |
(La du merke til at pandas oppgraderte to av kolonnene til flyttall for å imøtekomme NaN
-ene?)
Du kan ikke fjerne en enkelt verdi fra en DataFrame
, så du må fjerne hele rader eller kolonner. Avhengig av hva du gjør, kan du ønske å gjøre det ene eller det andre, og pandas gir deg alternativer for begge. Siden kolonner generelt representerer variabler og rader representerer observasjoner i dataanalyse, er det mer sannsynlig at du fjerner rader med data; standardinnstillingen for dropna()
er å fjerne alle rader som inneholder nullverdier:
example2.dropna()
0 1 2
1 2.0 5.0 8
Hvis nødvendig, kan du fjerne NA-verdier fra kolonner. Bruk axis=1
for å gjøre dette:
example2.dropna(axis='columns')
2
0 7
1 8
2 9
Merk at dette kan fjerne mye data som du kanskje vil beholde, spesielt i mindre datasett. Hva om du bare vil fjerne rader eller kolonner som inneholder flere eller til og med bare alle nullverdier? Du spesifiserer disse innstillingene i dropna
med parameterne how
og thresh
.
Som standard er how='any'
(hvis du vil sjekke selv eller se hvilke andre parametere metoden har, kjør example4.dropna?
i en kodecelle). Du kan alternativt spesifisere how='all'
for å bare fjerne rader eller kolonner som inneholder alle nullverdier. La oss utvide vårt eksempel DataFrame
for å se dette i praksis.
example2[3] = np.nan
example2
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | 1.0 | NaN | 7 | NaN |
1 | 2.0 | 5.0 | 8 | NaN |
2 | NaN | 6.0 | 9 | NaN |
Parameteren thresh
gir deg mer detaljert kontroll: du angir antall ikke-null verdier som en rad eller kolonne må ha for å bli beholdt:
example2.dropna(axis='rows', thresh=3)
0 1 2 3
1 2.0 5.0 8 NaN
Her har den første og siste raden blitt fjernet, fordi de inneholder bare to ikke-null verdier.
- Fylle nullverdier: Avhengig av datasettet ditt, kan det noen ganger være mer fornuftig å fylle nullverdier med gyldige verdier i stedet for å fjerne dem. Du kan bruke
isnull
til å gjøre dette direkte, men det kan være arbeidskrevende, spesielt hvis du har mange verdier å fylle. Siden dette er en så vanlig oppgave i dataanalyse, gir pandasfillna
, som returnerer en kopi avSeries
ellerDataFrame
med de manglende verdiene erstattet med en verdi du velger. La oss lage et annet eksempelSeries
for å se hvordan dette fungerer i praksis.
example3 = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
example3
a 1.0
b NaN
c 2.0
d NaN
e 3.0
dtype: float64
Du kan fylle alle nullverdiene med en enkelt verdi, som 0
:
example3.fillna(0)
a 1.0
b 0.0
c 2.0
d 0.0
e 3.0
dtype: float64
Du kan fremoverfylle nullverdier, som vil bruke den siste gyldige verdien til å fylle en null:
example3.fillna(method='ffill')
a 1.0
b 1.0
c 2.0
d 2.0
e 3.0
dtype: float64
Du kan også bakoverfylle for å propagere den neste gyldige verdien bakover for å fylle en null:
example3.fillna(method='bfill')
a 1.0
b 2.0
c 2.0
d 3.0
e 3.0
dtype: float64
Som du kanskje gjetter, fungerer dette på samme måte med DataFrame
s, men du kan også spesifisere en axis
langs hvilken du fyller nullverdier. Ved å bruke det tidligere brukte example2
igjen:
example2.fillna(method='ffill', axis=1)
0 1 2 3
0 1.0 1.0 7.0 7.0
1 2.0 5.0 8.0 8.0
2 NaN 6.0 9.0 9.0
Merk at når en tidligere verdi ikke er tilgjengelig for fremoverfylling, forblir nullverdien.
Hovedpoeng: Det finnes flere måter å håndtere manglende verdier i datasettene dine. Den spesifikke strategien du velger (fjerne dem, erstatte dem, eller hvordan du erstatter dem) bør styres av de spesifikke egenskapene til dataene. Du vil utvikle en bedre forståelse for hvordan du håndterer manglende verdier jo mer du arbeider med og interagerer med datasett.
Fjerne dupliserte data
Læringsmål: Etter denne delen bør du være komfortabel med å identifisere og fjerne dupliserte verdier fra DataFrames.
I tillegg til manglende data vil du ofte støte på dupliserte data i virkelige datasett. Heldigvis gir pandas
en enkel måte å oppdage og fjerne dupliserte oppføringer på.
- Identifisere duplikater:
duplicated
: Du kan enkelt finne dupliserte verdier ved å brukeduplicated
-metoden i pandas, som returnerer en boolsk maske som indikerer om en oppføring i enDataFrame
er en duplikat av en tidligere. La oss lage et annet eksempel på enDataFrame
for å se dette i praksis.
example4 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'],
'numbers': [1, 2, 1, 3, 3]})
example4
bokstaver | tall | |
---|---|---|
0 | A | 1 |
1 | B | 2 |
2 | A | 1 |
3 | B | 3 |
4 | B | 3 |
example4.duplicated()
0 False
1 False
2 True
3 False
4 True
dtype: bool
- Fjerne duplikater:
drop_duplicates
: returnerer enkelt en kopi av dataene der alleduplicated
-verdiene erFalse
:
example4.drop_duplicates()
letters numbers
0 A 1
1 B 2
3 B 3
Både duplicated
og drop_duplicates
vurderer som standard alle kolonner, men du kan spesifisere at de kun skal undersøke et delsett av kolonner i din DataFrame
:
example4.drop_duplicates(['letters'])
letters numbers
0 A 1
1 B 2
Viktig å huske: Å fjerne dupliserte data er en essensiell del av nesten alle dataanalyseprosjekter. Dupliserte data kan endre resultatene av analysene dine og gi deg unøyaktige resultater!
🚀 Utfordring
Alt materiale som er diskutert er tilgjengelig som en Jupyter Notebook. I tillegg finnes det øvelser etter hver seksjon – prøv dem!
Quiz etter forelesning
Gjennomgang og selvstudium
Det finnes mange måter å oppdage og tilnærme seg forberedelse av data for analyse og modellering, og rengjøring av data er et viktig steg som krever praktisk erfaring. Prøv disse utfordringene fra Kaggle for å utforske teknikker som ikke ble dekket i denne leksjonen.
Oppgave
Evaluering av data fra et skjema
Ansvarsfraskrivelse:
Dette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten Co-op Translator. Selv om vi streber etter nøyaktighet, vær oppmerksom på at automatiserte oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.