Python—關於Pandas缺失值問題(國內惟一)

獲取文中的 CSV文件 用於代碼編程以及文章首發地址,請點擊下方超連接

獲取CSV,用於編程調試請點這數據庫

在本文中,咱們將使用PythonPandas庫逐步完成許多不一樣的數據清理任務。具體而言,咱們將重點關注多是最大的數據清理任務,即 缺乏值。編程

缺失值的來源

在深刻研究代碼以前,瞭解丟失數據的來源很重要。這是數據丟失的一些典型緣由:編碼

  • 用戶忘記填寫字段。
  • 從舊版數據庫手動傳輸時,數據丟失。
  • 發生編程錯誤。
  • 用戶選擇不填寫字段。

其中一些來源只是簡單的隨機錯誤。在其餘時候,可能會有更深層的緣由致使數據丟失。spa

準備工做

在開始清理數據集以前,最好先大體瞭解一下數據。調試

  • 有哪些功能?
  • 預期的類型是什麼(int,float,string,boolean)?
  • 是否有明顯的缺失數據(熊貓能夠檢測到的值)?
  • 是否還有其餘類型的丟失數據不太明顯(沒法經過Pandas輕鬆檢測到)?

了說明個人意思,讓咱們開始研究示例。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」一欄,瞭解個人意思。
在這裏插入圖片描述

在此列中,有四個缺失值。

  • n/a
  • NA
  • na

從上面中,咱們知道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),所以此數字類型應爲缺失值

這個示例稍微複雜一點,所以咱們須要考慮一種策略來檢測這些類型的缺失值。有不少不一樣的方法,可是這是我要經過這種方法工做的方式。

  • 遍歷OWN_OCCUPIED列
  • 嘗試將條目轉換爲整數
  • 若是條目能夠更改成整數,請輸入缺失值
  • 若是數字不能是整數,咱們知道它是一個字符串,因此繼續

看一下代碼,而後我將對其進行詳細介紹

# 檢測數據
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將繼續。

您會注意到我使用tryexcept 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)
相關文章
相關標籤/搜索