Att bemästra konsten att rengöra data i Python - KDnuggets

Att bemästra konsten att rengöra data i Python – KDnuggets

Källnod: 2939047

Bemästra konsten att rengöra data i Python
Bild av författare
 

Datarensning är en kritisk del av all dataanalysprocess. Det är steget där du tar bort fel, hanterar saknad data och ser till att din data är i ett format som du kan arbeta med. Utan en väl rengjord datauppsättning kan eventuella efterföljande analyser vara skeva eller felaktiga.

Den här artikeln introducerar dig till flera nyckeltekniker för datarensning i Python, med hjälp av kraftfulla bibliotek som pandor, numpy, seaborn och matplotlib.

Innan vi dyker in i mekaniken för datarensning, låt oss förstå dess betydelse. Data från den verkliga världen är ofta rörig. Den kan innehålla dubbla poster, felaktiga eller inkonsekventa datatyper, saknade värden, irrelevanta funktioner och extremvärden. Alla dessa faktorer kan leda till missvisande slutsatser vid analys av data. Detta gör datarensning till en oumbärlig del av datavetenskapens livscykel.

Vi kommer att täcka följande uppgifter att rensa uppgifter.
 

Bemästra konsten att rengöra data i Python
Bild av författare

Innan vi börjar, låt oss importera de nödvändiga biblioteken. Vi kommer att använda pandor för datamanipulation, och seaborn och matplotlib för visualiseringar.

Vi kommer också att importera datetime Python-modulen för att manipulera datumen.

import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

Först måste vi ladda vår data. I det här exemplet ska vi ladda en CSV-fil med pandor. Vi lägger också till avgränsningsargumentet.

df = pd.read_csv('F:KDNuggetsKDN Mastering the Art of Data Cleaning in Pythonproperty.csv', delimiter= ';')

Därefter är det viktigt att inspektera data för att förstå dess struktur, vilken typ av variabler vi arbetar med och om det saknas några värden. Eftersom data vi importerade inte är enorma, låt oss ta en titt på hela datasetet.

# Look at all the rows of the dataframe
display(df)

Så här ser datasetet ut.

 

Bemästra konsten att rengöra data i Python
 

Du kan direkt se att det saknas värden. Dessutom är datumformaten inkonsekventa.

Låt oss nu ta en titt på DataFrame-sammanfattningen med hjälp av metoden info().

# Get a concise summary of the dataframe
print(df.info())

Här är kodutgången.

 

Bemästra konsten att rengöra data i Python
 

Vi kan se att endast kolumnen square_feet inte har några NULL-värden, så vi måste på något sätt hantera detta. Kolumnerna annonsdatum och försäljningsdatum är också objektdatatypen, även om detta bör vara ett datum.

Kolumnplatsen är helt tom. Behöver vi det?

Vi visar dig hur du hanterar dessa problem. Vi börjar med att lära oss hur man tar bort onödiga kolumner.

Det finns två kolumner i datamängden som vi inte behöver i vår dataanalys, så vi tar bort dem.

Den första kolumnen är köpare. Vi behöver det inte, eftersom köparens namn inte påverkar analysen.

Vi använder metoden drop() med det angivna kolumnnamnet. Vi sätter axeln till 1 för att ange att vi vill ta bort en kolumn. Dessutom är inplace-argumentet satt till True så att vi modifierar den befintliga DataFrame och inte skapar en ny DataFrame utan den borttagna kolumnen.

df.drop('buyer', axis = 1, inplace = True)

Den andra kolumnen vi vill ta bort är plats. Även om det kan vara användbart att ha denna information, är det här en helt tom kolumn, så låt oss bara ta bort den.

Vi tar samma tillvägagångssätt som med den första kolumnen.

df.drop('location', axis = 1, inplace = True)

Naturligtvis kan du ta bort dessa två kolumner samtidigt.

df = df.drop(['buyer', 'location'], axis=1)

Båda tillvägagångssätten returnerar följande dataram.

 

Bemästra konsten att rengöra data i Python

Dubblettdata kan förekomma i din datauppsättning av olika anledningar och kan förvränga din analys.

Låt oss upptäcka dubbletterna i vår datauppsättning. Så här gör du.

Nedanstående kod använder metoden duplicerad() att överväga dubbletter i hela datasetet. Dess standardinställning är att betrakta den första förekomsten av ett värde som unik och de efterföljande förekomsterna som dubbletter. Du kan ändra detta beteende med hjälp av hålla parameter. Till exempel skulle df.duplicated(keep=False) markera alla dubbletter som True, inklusive den första förekomsten.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Här är utgången.

 

Bemästra konsten att rengöra data i Python
 

Raden med index 3 har markerats som dubblett eftersom rad 2 med samma värden är dess första förekomst.

Nu måste vi ta bort dubbletter, vilket vi gör med följande kod.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Smakämnen drop_duplicates() funktionen tar hänsyn till alla kolumner samtidigt som du identifierar dubbletter. Om du bara vill överväga vissa kolumner kan du skicka dem som en lista till den här funktionen så här: df.drop_duplicates(subset=['column1', 'column2']).

 

Bemästra konsten att rengöra data i Python
 

Som du kan se har dubblettraden tagits bort. Indexeringen förblev dock densamma, med index 3 saknas. Vi städar upp det här genom att nollställa index.

df = df.reset_index(drop=True)

Denna uppgift utförs med hjälp av reset_index() fungera. Argumentet drop=True används för att kassera det ursprungliga indexet. Om du inte inkluderar detta argument kommer det gamla indexet att läggas till som en ny kolumn i din DataFrame. Genom att ställa in drop=True säger du till pandor att glömma det gamla indexet och återställa det till standardheltalsindexet.

För övning, försök ta bort dubbletter från denna Microsoft-datauppsättning.

Ibland kan datatyper vara felaktigt inställda. Till exempel kan en datumkolumn tolkas som strängar. Du måste konvertera dessa till deras lämpliga typer.

I vår datauppsättning kommer vi att göra det för kolumnerna annonsdatum och försäljningsdatum, eftersom de visas som objektdatatyp. Dessutom formateras datumdatum olika över raderna. Vi måste göra det konsekvent, tillsammans med att konvertera det till datum.

Det enklaste sättet är att använda to_datetime() metod. Återigen, du kan göra det kolumn för kolumn, som visas nedan.

När vi gör det ställer vi in ​​dayfirst-argumentet till True eftersom vissa datum börjar med dagen först.

# Converting advertisement_date column to datetime
df['advertisement_date'] = pd.to_datetime(df['advertisement_date'], dayfirst = True) # Converting sale_date column to datetime
df['sale_date'] = pd.to_datetime(df['sale_date'], dayfirst = True)

Du kan också konvertera båda kolumnerna samtidigt genom att använda tillämpa() metod med to_datetime().

# Converting advertisement_date and sale_date columns to datetime
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(pd.to_datetime, dayfirst = True)

Båda tillvägagångssätten ger dig samma resultat.

 

Bemästra konsten att rengöra data i Python
 

Nu är datumen i ett konsekvent format. Vi ser att inte all data har konverterats. Det finns ett NaT-värde i annonsdatum och två i försäljningsdatum. Det betyder att datumet saknas.

Låt oss kontrollera om kolumnerna konverteras till datum med hjälp av info() metod.

# Get a concise summary of the dataframe
print(df.info())

 

Bemästra konsten att rengöra data i Python
 

Som du kan se är båda kolumnerna inte i formatet datetime64[ns].

Försök nu att konvertera data från TEXT till NUMERIC i detta Airbnb dataset.

Datauppsättningar i verkliga världen saknar ofta värden. Det är viktigt att hantera saknad data, eftersom vissa algoritmer inte kan hantera sådana värden.

Vårt exempel har också några saknade värden, så låt oss ta en titt på de två vanligaste metoderna för att hantera saknad data.

Ta bort rader med saknade värden

Om antalet rader med saknade data är obetydligt jämfört med det totala antalet observationer, kan du överväga att ta bort dessa rader.

I vårt exempel har den sista raden inga värden förutom kvadratfot och annonsdatum. Vi kan inte använda sådan data, så låt oss ta bort den här raden.

Här är koden där vi anger radens index.

df = df.drop(8)

DataFrame ser nu ut så här.

 

Bemästra konsten att rengöra data i Python
 

Den sista raden har tagits bort och vår DataFrame ser nu bättre ut. Men det saknas fortfarande en del data som vi kommer att hantera med ett annat tillvägagångssätt.

Tillskriva saknade värden

Om du har betydande saknade data kan en bättre strategi än att ta bort vara tillskrivning. Denna process innebär att man fyller i saknade värden baserat på andra data. För numeriska data innebär vanliga imputeringsmetoder att man använder ett mått på central tendens (medelvärde, median, läge).

I vår redan ändrade DataFrame har vi NaT-värden (Not a Time) i kolumnerna annonsdatum och försäljningsdatum. Vi kommer att tillräkna dessa saknade värden med hjälp av betyda() metod.

Koden använder fyllna() metod för att hitta och fylla nollvärdena med medelvärdet.

# Imputing values for numerical columns
df['advertisement_date'] = df['advertisement_date'].fillna(df['advertisement_date'].mean())
df['sale_date'] = df['sale_date'].fillna(df['sale_date'].mean())

Du kan också göra samma sak i en kodrad. Vi använder tillämpa() för att tillämpa den funktion som definieras med lambda. Samma som ovan, denna funktion använder fyllna() och betyda() metoder för att fylla i de saknade värdena.

# Imputing values for multiple numerical columns
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(lambda x: x.fillna(x.mean()))

Utgången ser i båda fallen ut så här.

 

Bemästra konsten att rengöra data i Python
 

Vår sale_date kolumn har nu tider som vi inte behöver. Låt oss ta bort dem.

Vi använder strftime () metod, som konverterar datumen till deras strängrepresentation och ett specifikt format.

df['sale_date'] = df['sale_date'].dt.strftime('%Y-%m-%d')

 

Bemästra konsten att rengöra data i Python
 

Datumen ser nu städade ut.

Om du behöver använda strftime () på flera kolumner kan du återigen använda lambda på följande sätt.

df[['date1_formatted', 'date2_formatted']] = df[['date1', 'date2']].apply(lambda x: x.dt.strftime('%Y-%m-%d'))

Låt oss nu se hur vi kan tillskriva saknade kategoriska värden.

Kategorisk data är en typ av data som används för att gruppera information med liknande egenskaper. Var och en av dessa grupper är en kategori. Kategoriska data kan anta numeriska värden (som "1" som indikerar "man" och "2" som indikerar "kvinna"), men dessa siffror har ingen matematisk betydelse. Du kan till exempel inte lägga ihop dem.

Kategorisk data delas vanligtvis in i två kategorier:

  1. Nominell data: Detta är när kategorierna bara är märkta och inte kan ordnas i någon speciell ordning. Exempel inkluderar kön (man, kvinna), blodgrupp (A, B, AB, O) eller färg (röd, grön, blå).
  1. Ordinaldata: Det är då kategorierna kan beställas eller rangordnas. Även om intervallen mellan kategorierna inte är lika fördelade, har ordningen på kategorierna en betydelse. Exempel inkluderar betygsskalor (1 till 5 betyg av en film), en utbildningsnivå (gymnasium, grundutbildning, kandidatexamen) eller stadier av cancer (steg I, Steg II, Steg III).

För tillskrivning av saknade kategoridata används vanligtvis läget. I vårt exempel är kolumnen property_category kategorisk (nominell) data, och det saknas data i två rader.

Låt oss ersätta de saknade värdena med läge.

# For categorical columns
df['property_category'] = df['property_category'].fillna(df['property_category'].mode()[0])

Den här koden använder fyllna() funktion för att ersätta alla NaN-värden i kolumnen egenskapskategori. Den ersätter den med mode.

Dessutom används [0] delen för att extrahera det första värdet från denna serie. Om det finns flera lägen kommer detta att välja det första. Om det bara finns ett läge fungerar det fortfarande bra.

Här är utgången.

 

Bemästra konsten att rengöra data i Python
 

Datan ser nu ganska bra ut. Det enda som återstår är att se om det finns extremvärden.

Du kan träna på att hantera nollor på detta Metaintervjufråga, där du måste ersätta NULL med nollor.

Outliers är datapunkter i en datauppsättning som skiljer sig tydligt från de andra observationerna. De kan ligga exceptionellt långt från de andra värdena i datamängden, utanför ett övergripande mönster. De anses vara ovanliga på grund av att deras värden antingen är betydligt högre eller lägre jämfört med resten av data.

Outliers kan uppstå på grund av olika orsaker som:

  • Mät- eller inmatningsfel
  • Datakorruption
  • Sanna statistiska anomalier

Outliers kan avsevärt påverka resultaten av din dataanalys och statistiska modellering. De kan leda till en skev fördelning, snedvridning eller ogiltigförklara de underliggande statistiska antagandena, förvränga den uppskattade modellanpassningen, minska den prediktiva noggrannheten hos prediktiva modeller och leda till felaktiga slutsatser.

Några vanliga metoder för att upptäcka extremvärden är Z-score, IQR (Interquartile Range), boxplots, scatterplots och datavisualiseringstekniker. I vissa avancerade fall används också maskininlärningsmetoder.

Visualisering av data kan hjälpa till att identifiera extremvärden. Seaborns boxplot är praktiskt för detta.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])

Vi använder plt.figure() för att ställa in figurens bredd och höjd i tum.

Sedan skapar vi boxplotten för kolumnerna annonserat_pris och rea_pris, som ser ut så här.

 

Bemästra konsten att rengöra data i Python
 

Handlingen kan förbättras för enklare användning genom att lägga till denna i ovanstående kod.

plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Vi använder ovanstående kod för att ställa in etiketterna för båda axlarna. Vi märker också att värdena på y-axeln finns i den vetenskapliga notationen, och vi kan inte använda det för prisvärdena. Så vi ändrar detta till vanlig stil med funktionen plt.ticklabel_format() .

Sedan skapar vi formateraren som kommer att visa värdena på y-axeln med kommatecken som tusen avgränsare och decimalpunkter. Den sista kodraden tillämpar detta på axeln.

Utgången ser nu ut så här.

 

Bemästra konsten att rengöra data i Python
 

Nu, hur identifierar och tar vi bort avvikelsen?

Ett av sätten är att använda IQR-metoden.

IQR, eller Interquartile Range, är en statistisk metod som används för att mäta variabilitet genom att dela upp en datamängd i kvartiler. Kvartiler delar upp en rangordnad datamängd i fyra lika delar, och värden inom intervallet för den första kvartilen (25:e percentilen) och den tredje kvartilen (75:e percentilen) utgör interkvartilintervallet.

Interkvartilintervallet används för att identifiera extremvärden i data. Så här fungerar det:

  1. Beräkna först den första kvartilen (Q1), den tredje kvartilen (Q3), och bestäm sedan IQR. IQR beräknas som Q3 – Q1.
  2. Alla värden under Q1 – 1.5IQR eller över Q3 + 1.5IQR anses vara en extremvärde.

På vår boxplot representerar boxen faktiskt IQR. Linjen inuti rutan är medianen (eller andra kvartilen). 'Morhåren' på boxplotten representerar intervallet inom 1.5*IQR från Q1 och Q3.

Alla datapunkter utanför dessa morrhår kan betraktas som extremvärden. I vårt fall är det värdet av 12,000,000 XNUMX XNUMX USD. Om du tittar på boxplotten ser du hur tydligt detta representeras, vilket visar varför datavisualisering är viktigt för att upptäcka extremvärden.

Låt oss nu ta bort extremvärdena genom att använda IQR-metoden i Python-kod. Först tar vi bort de utannonserade prisavvikelserna.

Q1 = df['advertised_price'].quantile(0.25)
Q3 = df['advertised_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['advertised_price'] (Q1 - 1.5 * IQR)) |(df['advertised_price'] > (Q3 + 1.5 * IQR)))]

Vi beräknar först den första kvartilen (eller den 25:e percentilen) med hjälp av quantile() fungera. Vi gör samma sak för tredje kvartilen eller 75:e percentilen.

De visar de värden under vilka 25 % respektive 75 % av datan faller.

Sedan räknar vi ut skillnaden mellan kvartilerna. Allt hittills är bara att översätta IQR-stegen till Python-kod.

Som ett sista steg tar vi bort extremvärdena. Med andra ord, alla data mindre än Q1 – 1.5 * IQR eller mer än Q3 + 1.5 * IQR.

Operatören '~' negerar villkoret, så vi har bara data som inte är extremvärden.

Då kan vi göra samma sak med reapriset.

Q1 = df['sale_price'].quantile(0.25)
Q3 = df['sale_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['sale_price'] (Q1 - 1.5 * IQR)) |(df['sale_price'] > (Q3 + 1.5 * IQR)))]

Naturligtvis kan du göra det på ett mer kortfattat sätt med hjälp av för slinga.

for column in ['advertised_price', 'sale_price']: Q1 = df[column].quantile(0.25) Q3 = df[column].quantile(0.75) IQR = Q3 - Q1 df = df[~((df[column] (Q1 - 1.5 * IQR)) |(df[column] > (Q3 + 1.5 * IQR)))]

Slingan itererar de två kolumnerna. För varje kolumn beräknar den IQR och tar sedan bort raderna i DataFrame.

Observera att denna operation görs sekventiellt, först för annonserat_pris och sedan för försäljningspris. Som ett resultat ändras DataFrame på plats för varje kolumn, och rader kan tas bort på grund av att de är en extremvärde i båda kolumnerna. Därför kan den här åtgärden resultera i färre rader än om extremvärden för annonserat_pris och försäljningspris togs bort oberoende av varandra och resultaten kombinerades efteråt.

I vårt exempel kommer utgången att vara densamma i båda fallen. För att se hur boxplotten förändrades måste vi plotta den igen med samma kod som tidigare.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])
plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Här är utgången.

 

Bemästra konsten att rengöra data i Python
 

Du kan träna på att beräkna percentiler i Python genom att lösa Intervjufråga för generalförsamlingen.

Datarensning är ett avgörande steg i dataanalysprocessen. Även om det kan vara tidskrävande, är det viktigt att säkerställa att dina resultat är korrekta.

Lyckligtvis gör Pythons rika ekosystem av bibliotek denna process mer hanterbar. Vi lärde oss hur man tar bort onödiga rader och kolumner, formaterar om data och hanterar saknade värden och extremvärden. Det här är de vanliga stegen som måste utföras på de flesta data. Men ibland behöver du det också kombinera två kolumner till en, verifiera befintliga uppgifter, tilldela etiketter till den, eller bli av med de vita utrymmena.

Allt detta är datarensning, eftersom det låter dig förvandla rörig, verklig data till en välstrukturerad datauppsättning som du kan analysera med tillförsikt. Jämför bara datasetet vi började med med det vi slutade med.

Om du inte ser tillfredsställelsen i det här resultatet och den rena datan inte gör dig konstigt upphetsad, vad i hela friden gör du inom datavetenskap!?
 

Nate Rosidi är datavetare och inom produktstrategi. Han är också adjungerad professor som undervisar i analys och är grundaren av StrataScratch, en plattform som hjälper datavetare att förbereda sig för sina intervjuer med riktiga intervjufrågor från toppföretag. Ta kontakt med honom Twitter: StrataScratch or LinkedIn.

Tidsstämpel:

Mer från KDnuggets