Pandas缺失值處理 | 輕鬆玩轉Pandas(3)

教你學會 Pandas 不是個人目的,教你輕鬆玩轉 Pandas 纔是個人目的。我會經過一系列實例來帶入 Pandas 的知識點,讓你在學習 Pandas 的路上再也不枯燥。html

聲明:我所寫的輕鬆玩轉 Pandas 教程都是免費的,若是對你有幫助,你能夠持續關注我。python

Pandas基本功能詳解 | 輕鬆玩轉Pandas(2) 介紹了 Pandas 中經常使用的一些功能,使得咱們對 Pandas 的使用有了基本的瞭解。這一章節咱們來看下如何使用Pandas處理缺失值。正則表達式

# 導入相關庫
import numpy as np
import pandas as pd
複製代碼

什麼是缺失值

在瞭解缺失值(也叫控制)如何處理以前,首先要知道的就是什麼是缺失值?直觀上理解,缺失值表示的是「缺失的數據」學習

能夠思考一個問題:是什麼緣由形成的缺失值呢?其實有不少緣由,實際生活中可能因爲有的數據不全因此致使數據缺失,也有可能因爲誤操做致使數據缺失,又或者人爲地形成數據缺失。人工智能

來看下咱們的示例吧。spa

index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")

data = {
    "age": [18, 30, np.nan, 40, np.nan, 30],
    "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen", np.nan, " "],
    "sex": [None, "male", "female", "male", np.nan, "unknown"],
    "birth": ["2000-02-10", "1988-10-17", None, "1978-08-08", np.nan, "1988-10-17"]
}

user_info = pd.DataFrame(data=data, index=index)

# 將出生日期轉爲時間戳
user_info["birth"] = pd.to_datetime(user_info.birth)
user_info
複製代碼
age birth city sex
name
Tom 18.0 2000-02-10 BeiJing None
Bob 30.0 1988-10-17 ShangHai male
Mary NaN NaT GuangZhou female
James 40.0 1978-08-08 ShenZhen male
Andy NaN NaT NaN NaN
Alice 30.0 1988-10-17 unknown

能夠看到,用戶 Tom 的性別爲 None,用戶 Mary 的年齡爲 NAN,生日爲 NaT。在 Pandas 的眼中,這些都屬於缺失值,可使用 isnull()notnull() 方法來操做。code

user_info.isnull()
複製代碼
age birth city sex
name
Tom False False False True
Bob False False False False
Mary True True False False
James False False False False
Andy True True True True
Alice False False False False

除了簡單的能夠識別出哪些是缺失值或非缺失值外,最經常使用的就是過濾掉一些缺失的行。好比,我想過濾掉用戶年齡爲空的用戶,如何操做呢?cdn

user_info[user_info.age.notnull()]
複製代碼
age birth city sex
name
Tom 18.0 2000-02-10 BeiJing None
Bob 30.0 1988-10-17 ShangHai male
James 40.0 1978-08-08 ShenZhen male
Alice 30.0 1988-10-17 unknown

丟棄缺失值

既然有缺失值了,常見的一種處理辦法就是丟棄缺失值。使用 dropna 方法能夠丟棄缺失值。htm

user_info.age.dropna()
複製代碼
name
Tom      18.0
Bob      30.0
James    40.0
Alice    30.0
Name: age, dtype: float64
複製代碼

Seriese 使用 dropna 比較簡單,對於 DataFrame 來講,能夠設置更多的參數。對象

axis 參數用於控制行或列,跟其餘不同的是,axis=0 (默認)表示操做行,axis=1 表示操做列。

how 參數可選的值爲 any(默認) 或者 allany 表示一行/列有任意元素爲空時即丟棄,all 一行/列全部值都爲空時才丟棄。

subset 參數表示刪除時只考慮的索引或列名。

thresh參數的類型爲整數,它的做用是,好比 thresh=3,會在一行/列中至少有 3 個非空值時將其保留。

# 一行數據只要有一個字段存在空值即刪除
user_info.dropna(axis=0, how="any")
複製代碼
age birth city sex
name
Bob 30.0 1988-10-17 ShangHai male
James 40.0 1978-08-08 ShenZhen male
Alice 30.0 1988-10-17 unknown
# 一行數據全部字段都爲空值才刪除
user_info.dropna(axis=0, how="all")
複製代碼
age birth city sex
name
Tom 18.0 2000-02-10 BeiJing None
Bob 30.0 1988-10-17 ShangHai male
Mary NaN NaT GuangZhou female
James 40.0 1978-08-08 ShenZhen male
Alice 30.0 1988-10-17 unknown
# 一行數據中只要 city 或 sex 存在空值即刪除
user_info.dropna(axis=0, how="any", subset=["city", "sex"])
複製代碼
age birth city sex
name
Bob 30.0 1988-10-17 ShangHai male
Mary NaN NaT GuangZhou female
James 40.0 1978-08-08 ShenZhen male
Alice 30.0 1988-10-17 unknown

填充缺失值

除了能夠丟棄缺失值外,也能夠填充缺失值,最多見的是使用 fillna 完成填充。

fillna 這名字一看就是用來填充缺失值的。

填充缺失值時,常見的一種方式是使用一個標量來填充。例如,這裏我樣有缺失的年齡都填充爲 0。

user_info.age.fillna(0)
複製代碼
name
Tom      18.0
Bob      30.0
Mary      0.0
James    40.0
Andy      0.0
Alice    30.0
Name: age, dtype: float64
複製代碼

除了可使用標量來填充以外,還可使用前一個或後一個有效值來填充。

設置參數 method='pad'method='ffill' 可使用前一個有效值來填充。

user_info.age.fillna(method="ffill")
複製代碼
name
Tom      18.0
Bob      30.0
Mary     30.0
James    40.0
Andy     40.0
Alice    30.0
Name: age, dtype: float64
複製代碼

設置參數 method='bfill'method='backfill' 可使用後一個有效值來填充。

user_info.age.fillna(method="backfill")
複製代碼
name
Tom      18.0
Bob      30.0
Mary     40.0
James    40.0
Andy     30.0
Alice    30.0
Name: age, dtype: float64
複製代碼

除了經過 fillna 方法來填充缺失值外,還能夠經過 interpolate 方法來填充。默認狀況下使用線性差值,能夠是設置 method 參數來改變方式。

user_info.age.interpolate()
複製代碼
name
Tom      18.0
Bob      30.0
Mary     35.0
James    40.0
Andy     35.0
Alice    30.0
Name: age, dtype: float64
複製代碼

替換缺失值

你們有沒有想過一個問題:到底什麼纔是缺失值呢?你可能會奇怪說,前面不是已經說過了麼,Nonenp.nanNaT 這些都是缺失值。可是我也說過了,這些在 Pandas 的眼中是缺失值,有時候在咱們人類的眼中,某些異常值咱們也會當作缺失值來處理。

例如,在咱們的存儲的用戶信息中,假定咱們限定用戶都是青年,出現了年齡爲 40 的,咱們就能夠認爲這是一個異常值。再好比,咱們都知道性別分爲男性(male)和女性(female),在記錄用戶性別的時候,對於未知的用戶性別都記爲了 「unknown」,很明顯,咱們也能夠認爲「unknown」是缺失值。此外,有的時候會出現空白字符串,這些也能夠認爲是缺失值。

對於上面的這種狀況,咱們可使用 replace 方法來替換缺失值。

user_info.age.replace(40, np.nan)
複製代碼
name
Tom      18.0
Bob      30.0
Mary      NaN
James     NaN
Andy      NaN
Alice    30.0
Name: age, dtype: float64
複製代碼

也能夠指定一個映射字典。

user_info.age.replace({40: np.nan})
複製代碼
name
Tom      18.0
Bob      30.0
Mary      NaN
James     NaN
Andy      NaN
Alice    30.0
Name: age, dtype: float64
複製代碼

對於 DataFrame,能夠指定每列要替換的值。

user_info.replace({"age": 40, "birth": pd.Timestamp("1978-08-08")}, np.nan)
複製代碼
age birth city sex
name
Tom 18.0 2000-02-10 BeiJing None
Bob 30.0 1988-10-17 ShangHai male
Mary NaN NaT GuangZhou female
James NaN NaT ShenZhen male
Andy NaN NaT NaN NaN
Alice 30.0 1988-10-17 unknown

相似地,咱們能夠將特定字符串進行替換,如:將 "unknown" 進行替換。

user_info.sex.replace("unknown", np.nan)
複製代碼
name
Tom        None
Bob        male
Mary     female
James      male
Andy        NaN
Alice       NaN
Name: sex, dtype: object
複製代碼

除了能夠替換特定的值以外,還可使用正則表達式來替換,如:將空白字符串替換成空值。

user_info.city.replace(r'\s+', np.nan, regex=True)
複製代碼
name
Tom        BeiJing
Bob       ShangHai
Mary     GuangZhou
James     ShenZhen
Andy           NaN
Alice          NaN
Name: city, dtype: object
複製代碼

使用其餘對象填充

除了咱們本身手動丟棄、填充已經替換缺失值以外,咱們還可使用其餘對象來填充。

例若有兩個關於用戶年齡的 Series,其中一個有缺失值,另外一個沒有,咱們能夠將沒有的缺失值的 Series 中的元素傳給有缺失值的。

age_new = user_info.age.copy()
age_new.fillna(20, inplace=True)
age_new
複製代碼
name
Tom      18.0
Bob      30.0
Mary     20.0
James    40.0
Andy     20.0
Alice    30.0
Name: age, dtype: float64
複製代碼
user_info.age.combine_first(age_new)
複製代碼
name
Tom      18.0
Bob      30.0
Mary     20.0
James    40.0
Andy     20.0
Alice    30.0
Name: age, dtype: float64
複製代碼

能夠看到,用戶信息中關於年齡的缺失值都使用 age_new 這個 Series 填充了。


想要學習更多關於人工智能的知識,請關注公衆號:AI派

qrcode_for_gh_60cef389e81c_258.jpg

這裏我將整篇文章的內容整理成了pdf,想要pdf文件的能夠在公衆號後臺回覆關鍵字:pandas03

更多Pandas知識見:輕鬆玩轉Pandas

相關文章
相關標籤/搜索