18 KiB
Arbejde med data: Dataklargøring
![]() |
---|
Dataklargøring - Sketchnote af @nitya |
Quiz før lektion
Afhængigt af kilden kan rå data indeholde nogle uoverensstemmelser, der skaber udfordringer i analyse og modellering. Med andre ord kan disse data kategoriseres som "beskidte" og skal renses. Denne lektion fokuserer på teknikker til at rense og transformere data for at håndtere udfordringer med manglende, unøjagtige eller ufuldstændige data. Emnerne i denne lektion vil benytte Python og Pandas-biblioteket og vil blive demonstreret i notebooken i denne mappe.
Vigtigheden af at rense data
-
Lettere at bruge og genbruge: Når data er korrekt organiseret og normaliseret, bliver det lettere at søge, bruge og dele med andre.
-
Konsistens: Data science kræver ofte arbejde med mere end ét datasæt, hvor datasæt fra forskellige kilder skal kombineres. At sikre, at hvert enkelt datasæt har fælles standardisering, sikrer, at dataene stadig er brugbare, når de samles i ét datasæt.
-
Modelnøjagtighed: Rensede data forbedrer nøjagtigheden af de modeller, der er afhængige af dem.
Almindelige mål og strategier for datarensning
-
Udforskning af et datasæt: Dataudforskning, som dækkes i en senere lektion, kan hjælpe dig med at identificere data, der skal renses. Visuel observation af værdier i et datasæt kan give en forventning om, hvordan resten af det vil se ud, eller give en idé om problemer, der kan løses. Udforskning kan involvere grundlæggende forespørgsler, visualiseringer og sampling.
-
Formatering: Afhængigt af kilden kan data have uoverensstemmelser i, hvordan de præsenteres. Dette kan skabe problemer med at søge efter og repræsentere værdier, hvor de ses i datasættet, men ikke er korrekt repræsenteret i visualiseringer eller forespørgselsresultater. Almindelige formateringsproblemer involverer at løse mellemrum, datoer og datatyper. At løse formateringsproblemer er typisk op til dem, der bruger dataene. For eksempel kan standarder for, hvordan datoer og tal præsenteres, variere fra land til land.
-
Duplikationer: Data med mere end én forekomst kan give unøjagtige resultater og bør normalt fjernes. Dette kan ofte ske, når to eller flere datasæt kombineres. Dog kan der være tilfælde, hvor duplikationer i kombinerede datasæt indeholder oplysninger, der kan være nyttige og derfor skal bevares.
-
Manglende data: Manglende data kan føre til unøjagtigheder samt svage eller forudindtagede resultater. Nogle gange kan dette løses ved at "genindlæse" dataene, udfylde de manglende værdier med beregninger og kode som Python, eller blot fjerne værdien og de tilhørende data. Der er mange grunde til, at data kan mangle, og de handlinger, der tages for at løse disse manglende værdier, kan afhænge af, hvordan og hvorfor de blev manglende.
Udforskning af DataFrame-information
Læringsmål: Ved slutningen af dette afsnit bør du være komfortabel med at finde generel information om data, der er gemt i pandas DataFrames.
Når du har indlæst dine data i pandas, vil de sandsynligvis være i en DataFrame (se den tidligere lektion for en detaljeret oversigt). Men hvis datasættet i din DataFrame har 60.000 rækker og 400 kolonner, hvordan begynder du så at få en fornemmelse af, hvad du arbejder med? Heldigvis giver pandas nogle praktiske værktøjer til hurtigt at få et overblik over en DataFrame samt de første og sidste rækker.
For at udforske denne funktionalitet vil vi importere Python scikit-learn biblioteket og bruge et ikonisk datasæt: Iris datasættet.
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 længde (cm) | sepal bredde (cm) | petal længde (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 at starte bruges
info()
-metoden til at udskrive en oversigt over indholdet i enDataFrame
. Lad os se på dette datasæt for at se, hvad 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
Ud fra dette ved vi, at Iris datasættet har 150 poster i fire kolonner uden null-værdier. Alle data er gemt som 64-bit floating-point tal.
- DataFrame.head(): For at tjekke det faktiske indhold af
DataFrame
bruger vihead()
-metoden. Lad os se, hvordan de første rækker af voresiris_df
ser ud:
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(): Omvendt, for at tjekke de sidste rækker af
DataFrame
, bruger 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
Konklusion: Bare ved at kigge på metadata om informationen i en DataFrame eller de første og sidste værdier, kan du få en umiddelbar idé om størrelsen, formen og indholdet af de data, du arbejder med.
Håndtering af manglende data
Læringsmål: Ved slutningen af dette afsnit bør du vide, hvordan du erstatter eller fjerner null-værdier fra DataFrames.
Ofte vil de datasæt, du ønsker at bruge (eller er nødt til at bruge), have manglende værdier. Hvordan manglende data håndteres indebærer subtile afvejninger, der kan påvirke din endelige analyse og virkelige resultater.
Pandas håndterer manglende værdier på to måder. Den første har du set før i tidligere afsnit: NaN
, eller Not a Number. Dette er faktisk en speciel værdi, der er en del af IEEE floating-point specifikationen og bruges kun til at indikere manglende floating-point værdier.
For manglende værdier udover floats bruger pandas Python-objektet None
. Selvom det kan virke forvirrende, at du vil støde på to forskellige typer værdier, der i bund og grund siger det samme, er der gode programmatiske grunde til dette designvalg, og i praksis giver det pandas mulighed for at levere et godt kompromis for de fleste tilfælde. Ikke desto mindre har både None
og NaN
begrænsninger, som du skal være opmærksom på med hensyn til, hvordan de kan bruges.
Læs mere om NaN
og None
i notebooken!
- Detektering af null-værdier: I
pandas
erisnull()
ognotnull()
dine primære metoder til at detektere null-data. Begge returnerer Boolean-masker over dine data. Vi vil brugenumpy
tilNaN
-værdier:
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øje på outputtet. Overrasker noget dig? Selvom 0
er en aritmetisk null, er det stadig et gyldigt heltal, og pandas behandler det som sådan. ''
er lidt mere subtil. Selvom vi brugte det i afsnit 1 til at repræsentere en tom strengværdi, er det stadig et strengobjekt og ikke en repræsentation af null ifølge pandas.
Nu vender vi dette om og bruger disse metoder på en måde, der ligner, hvordan du vil bruge dem i praksis. Du kan bruge Boolean-masker direkte som en Series
eller DataFrame
-indeks, hvilket kan være nyttigt, når du arbejder med isolerede manglende (eller tilstedeværende) værdier.
Konklusion: Både
isnull()
ognotnull()
producerer lignende resultater, når du bruger dem iDataFrame
s: de viser resultaterne og indekset for disse resultater, hvilket vil hjælpe dig enormt, når du arbejder med dine data.
- Fjernelse af null-værdier: Ud over at identificere manglende værdier giver pandas en praktisk måde at fjerne null-værdier fra
Series
ogDataFrame
s. (Især i store datasæt er det ofte mere tilrådeligt blot at fjerne manglende [NA] værdier fra din analyse end at håndtere dem på andre måder.) For at se dette i praksis vender vi tilbage tilexample1
:
example1 = example1.dropna()
example1
0 0
2
dtype: object
Bemærk, at dette bør ligne dit output fra example3[example3.notnull()]
. Forskellen her er, at i stedet for blot at indeksere på de maskerede værdier, har dropna
fjernet de manglende værdier fra Series
example1
.
Fordi DataFrame
s har to dimensioner, giver de flere muligheder for at 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 |
(Har du bemærket, at pandas opgraderede to af kolonnerne til floats for at rumme NaN
'erne?)
Du kan ikke fjerne en enkelt værdi fra en DataFrame
, så du skal fjerne hele rækker eller kolonner. Afhængigt af hvad du laver, vil du måske gøre det ene eller det andet, og derfor giver pandas dig muligheder for begge dele. Fordi kolonner generelt repræsenterer variabler og rækker repræsenterer observationer i data science, er det mere sandsynligt, at du fjerner rækker af data; standardindstillingen for dropna()
er at fjerne alle rækker, der indeholder null-værdier:
example2.dropna()
0 1 2
1 2.0 5.0 8
Hvis nødvendigt kan du fjerne NA-værdier fra kolonner. Brug axis=1
for at gøre dette:
example2.dropna(axis='columns')
2
0 7
1 8
2 9
Bemærk, at dette kan fjerne mange data, som du måske vil beholde, især i mindre datasæt. Hvad hvis du kun vil fjerne rækker eller kolonner, der indeholder flere eller endda alle null-værdier? Du angiver disse indstillinger i dropna
med parametrene how
og thresh
.
Som standard er how='any'
(hvis du vil tjekke det selv eller se, hvilke andre parametre metoden har, kan du køre example4.dropna?
i en kodecelle). Du kan alternativt angive how='all'
for kun at fjerne rækker eller kolonner, der indeholder alle null-værdier. Lad os udvide vores eksempel DataFrame
for at 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
giver dig mere finjusteret kontrol: du angiver antallet af ikke-null værdier, som en række eller kolonne skal have for at blive bevaret:
example2.dropna(axis='rows', thresh=3)
0 1 2 3
1 2.0 5.0 8 NaN
Her er den første og sidste række blevet fjernet, fordi de kun indeholder to ikke-null værdier.
- Udfyldning af null-værdier: Afhængigt af dit datasæt kan det nogle gange give mere mening at udfylde null-værdier med gyldige værdier i stedet for at fjerne dem. Du kunne bruge
isnull
til at gøre dette direkte, men det kan være besværligt, især hvis du har mange værdier at udfylde. Fordi dette er en så almindelig opgave i data science, giver pandasfillna
, som returnerer en kopi afSeries
ellerDataFrame
med de manglende værdier erstattet med en af dine valg. Lad os oprette et andet eksempelSeries
for at 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 udfylde alle null-poster med en enkelt værdi, såsom 0
:
example3.fillna(0)
a 1.0
b 0.0
c 2.0
d 0.0
e 3.0
dtype: float64
Du kan forward-fill null-værdier, hvilket betyder at bruge den sidste gyldige værdi til at udfylde 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å back-fill for at propagere den næste gyldige værdi bagud for at udfylde 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 måske gætter, fungerer dette på samme måde med DataFrame
s, men du kan også angive en axis
, langs hvilken du vil udfylde null-værdier. Brug igen det tidligere anvendte example2
:
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
Bemærk, at når en tidligere værdi ikke er tilgængelig for forward-fill, forbliver null-værdien.
Vigtig pointe: Der er flere måder at håndtere manglende værdier i dine datasæt. Den specifikke strategi, du vælger (at fjerne dem, erstatte dem eller hvordan du erstatter dem), bør afhænge af de specifikke detaljer i dataene. Du vil få en bedre forståelse af, hvordan man håndterer manglende værdier, jo mere du arbejder med og interagerer med datasæt.
Fjernelse af duplikerede data
Læringsmål: Ved slutningen af denne del bør du være komfortabel med at identificere og fjerne duplikerede værdier fra DataFrames.
Ud over manglende data vil du ofte støde på duplikerede data i virkelige datasæt. Heldigvis tilbyder pandas
en nem metode til at opdage og fjerne duplikerede poster.
- Identificering af duplikater:
duplicated
: Du kan nemt finde duplikerede værdier ved hjælp af metodenduplicated
i pandas, som returnerer en Boolean-maske, der angiver, om en post i enDataFrame
er en duplikat af en tidligere. Lad os oprette et andet eksempel på enDataFrame
for at se dette i praksis.
example4 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'],
'numbers': [1, 2, 1, 3, 3]})
example4
bogstaver | tal | |
---|---|---|
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
- Fjernelse af duplikater:
drop_duplicates
: returnerer simpelthen en kopi af dataene, hvor alleduplicated
værdier erFalse
:
example4.drop_duplicates()
letters numbers
0 A 1
1 B 2
3 B 3
Både duplicated
og drop_duplicates
undersøger som standard alle kolonner, men du kan specificere, at de kun skal undersøge et delmængde af kolonner i din DataFrame
:
example4.drop_duplicates(['letters'])
letters numbers
0 A 1
1 B 2
Vigtig pointe: Fjernelse af duplikerede data er en essentiel del af næsten hvert data science-projekt. Duplikerede data kan ændre resultaterne af dine analyser og give dig unøjagtige resultater!
🚀 Udfordring
Alt det diskuterede materiale er tilgængeligt som en Jupyter Notebook. Derudover er der øvelser efter hver sektion – prøv dem!
Quiz efter forelæsning
Gennemgang & Selvstudie
Der findes mange måder at opdage og tilgå forberedelse af dine data til analyse og modellering, og rengøring af data er et vigtigt trin, der kræver praktisk erfaring. Prøv disse udfordringer fra Kaggle for at udforske teknikker, som denne lektion ikke dækkede.
Opgave
Evaluering af data fra en formular
Ansvarsfraskrivelse:
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten Co-op Translator. Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der måtte opstå som følge af brugen af denne oversættelse.