獲取文中的
CSV
文件
用於代碼編程以及文章首發地址,請點擊下方超連接
在本文中,咱們將使用Python
的Pandas
庫逐步完成許多不一樣的數據清理任務。具體而言,咱們將重點關注多是最大的數據清理任務,即 缺乏值。編程
在深刻研究代碼以前,瞭解丟失數據的來源很重要。這是數據丟失的一些典型緣由:編碼
其中一些來源只是簡單的隨機錯誤。在其餘時候,可能會有更深層的緣由致使數據丟失。spa
在開始清理數據集以前,最好先大體瞭解一下數據。調試
int,float,string,boolean
)?了說明個人意思,讓咱們開始研究示例。code
咱們要使用的數據是很是小的房地產數據集。獲取CSV
文件。你能夠單擊此處獲取,以即可以進行編碼。
圖片
快速瀏覽一下數據:rem
快速瞭解數據的一種好方法是查看前幾行。在Pandas
中,你要編寫如下代碼:文檔
# Importing libraries import pandas as pd import numpy as np # Read csv file into a pandas dataframe df = pd.read_csv("property data.csv") # Take a look at the first few rows print df.head()
Out: ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS 0 104.0 PUTNAM Y 3.0 1 197.0 LEXINGTON N 3.0 2 NaN LEXINGTON N 3.0 3 201.0 BERKELEY NaN 1.0 4 203.0 BERKELEY Y 3.0
我知道我說過咱們將使用Pandas
,可是能夠看到我也使用了Numpy
。稍後咱們將使用它來重命名一些缺失的值。字符串
導入庫後,咱們將csv
文件讀取到Pandas
數據框中。
使用該方法,咱們能夠輕鬆看到前幾行。(使用.head()
方法)
從列名稱中推斷出如下字符組很是容易:
ST_NUM
: 街道號碼ST_NAME
: 街道名稱OWN_OCCUPIED
:住所全部人是否被佔用NUM_BEDROOMS
:臥室數咱們還能夠進行設置,獲取的數據類型是啥?
ST_NUM
:float或int…某種數字類型ST_NAME
: 細繩OWN_OCCUPIED
:字符串…Y(「是」)或N(「否」)NUM_BEDROOMS
:float或int,數字類型「標準缺失值」是什麼意思?這些是Pandas
能夠檢測到的缺失值。
回到咱們的原始數據集,讓咱們看一下「 ST_NUM
」列。
第三列中有一個空單元格。在第七行中,有一個「 NA
」值。
顯然,這些都是缺失值。讓咱們看看Pandas
如何處理這些問題
# 查看ST_NUM列 print df['ST_NUM'] print df['ST_NUM'].isnull()
# 查看ST_NUM列 Out: 0 104.0 1 197.0 2 NaN 3 201.0 4 203.0 5 207.0 6 NaN 7 213.0 8 215.0 Out: 0 False 1 False 2 True 3 False 4 False 5 False 6 True 7 False 8 False
看一下該列,咱們能夠看到Pandas
在空白處填充了「 NA
」。使用該方法,咱們能夠確認缺失值和「 NA
」都被識別爲缺失值。兩個布爾響應均爲。isnull()
和True
這是一個簡單的示例,但強調了一個重點。Pandas
會將空單元格和「 NA
」類型都識別爲缺失值。 下面,我將介紹一些Pandas
沒法識別的類型。
有時多是缺乏具備不一樣格式的值的狀況。
讓咱們看一下「Number of Bedrooms
」一欄,瞭解個人意思。
在此列中,有四個缺失值。
從上面中,咱們知道Pandas
會將「 NA
」識別爲缺失值,但其餘的狀況呢?讓咱們來看看。
# 看NUM_BEDROOMS這一欄 print df['NUM_BEDROOMS'] print df['NUM_BEDROOMS'].isnull()
Out: 0 3 1 3 2 n/a 3 1 4 3 5 NaN 6 2 7 -- 8 na Out: 0 False 1 False 2 False 3 False 4 False 5 True 6 False 7 False 8 False
就像之前同樣,Pandas
認爲「 NA
」是缺失的價值。不幸的是,其餘類型未被識別。
若是有多個用戶手動輸入數據,則這是一個常見問題。也許我喜歡使用「 n / a
」,可是其餘人喜歡使用「 na
」。
檢測這些各類格式的一種簡單方法是將它們放在列表中。而後,當咱們導入數據時,Pandas
會當即識別出它們。這是咱們將如何執行此操做的示例。
# 列出缺失的值類型 missing_values = ["n/a", "na", "--"] df = pd.read_csv("property data.csv", na_values = missing_values)
如今,讓咱們再看一下該欄,看看會發生什麼。
# 看NUM_BEDROOMS這一欄 print df['NUM_BEDROOMS'] print df['NUM_BEDROOMS'].isnull()
Out: 0 3.0 1 3.0 2 NaN 3 1.0 4 3.0 5 NaN 6 2.0 7 NaN 8 NaN Out: 0 False 1 False 2 True 3 False 4 False 5 True 6 False 7 True 8 True
下面中,咱們將介紹一種更復雜但很常見的缺失值類型。
到目前爲止,咱們已經看到了標準缺失值和非標準缺失值。若是咱們出現意外類型怎麼辦?
例如,若是咱們的功能應該是字符串,可是有數字類型,那麼從技術上講,這也是一個缺失值。
讓咱們看一下「Owner Occupied
**」一欄,看看我在說什麼。
從前面的示例中,咱們知道Pandas
將檢測到第7行中的空單元格爲缺失值。讓咱們用一些代碼進行確認。
# 查看OWN_OCCUPIED列 print df['OWN_OCCUPIED'] print df['OWN_OCCUPIED'].isnull()
# 查看OWN_OCCUPIED列 Out: 0 Y 1 N 2 N 3 12 4 Y 5 Y 6 NaN 7 Y 8 Y Out: 0 False 1 False 2 False 3 False 4 False 5 False 6 True 7 False 8 False
在第四行中,數字爲12。Owner Occupied
的響應顯然應該是字符串(Y或N)
,所以此數字類型應爲缺失值。
這個示例稍微複雜一點,所以咱們須要考慮一種策略來檢測這些類型的缺失值。有不少不一樣的方法,可是這是我要經過這種方法工做的方式。
看一下代碼,而後我將對其進行詳細介紹
# 檢測數據 cnt=0 for row in df['OWN_OCCUPIED']: try: int(row) df.loc[cnt, 'OWN_OCCUPIED']=np.nan except ValueError: pass cnt+=1
在代碼中,咱們循環瀏覽「全部者已佔用」列中的每一個條目。要嘗試將條目更改成整數,咱們使用。int(row)
若是能夠將值更改成整數,則可使用Numpy's
將條目更改成缺乏的值。np.nan
另外一方面,若是不能將其更改成整數,咱們pass
將繼續。
您會注意到我使用try
和except ValueError
。這稱爲異常處理,咱們使用它來處理錯誤。
若是咱們嘗試將一個條目更改成一個整數而且沒法更改,則將ValueError返回a
,而且代碼將中止。爲了解決這個問題,咱們使用異常處理來識別這些錯誤,並繼續進行下去。
代碼的另外一個重要部分是.loc
方法。這是用於修改現有條目的首選Pandas方法。有關此的更多信息,請查看Pandas
文檔。
如今,咱們已經研究了檢測缺失值的不一樣方法,下面將概述和替換它們。
清除缺失的值後,咱們可能要對它們進行彙總。例如,咱們可能要查看每一個功能的缺失值總數。
# Total missing values for each feature print df.isnull().sum()
Out: ST_NUM 2 ST_NAME 0 OWN_OCCUPIED 2 NUM_BEDROOMS 4
在更多的時候,咱們可能須要進行快速檢查,以查看是否根本缺乏任何值。
# Any missing values? print df.isnull().values.any()
Out: True
咱們可能還但願得到缺失值的總數。
# Total number of missing values print df.isnull().sum().sum()
Out: 8
在上面,咱們總結了缺失值的數量,讓咱們看一下如何進行一些簡單的替換。
一般,您必須弄清楚如何處理缺失值。
有時,您只是想刪除這些行,而其餘時候,您將替換它們。
正如我以前提到的,這不該該掉以輕心。咱們將介紹一些基本的推論。
# 用一個數字替換缺失的值 df['ST_NUM'].fillna(125, inplace=True)
若是進行基於位置的插補。
# 基於位置的更換 df.loc[2,'ST_NUM'] = 125
替換缺失值的一種很是常見的方法是使用中位數。
# 取代使用中位數 median = df['NUM_BEDROOMS'].median() df['NUM_BEDROOMS'].fillna(median, inplace=True)