教你學會 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
(默認) 或者 all
。any
表示一行/列有任意元素爲空時即丟棄,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
複製代碼
你們有沒有想過一個問題:到底什麼纔是缺失值呢?你可能會奇怪說,前面不是已經說過了麼,None
、np.nan
、NaT
這些都是缺失值。可是我也說過了,這些在 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派
這裏我將整篇文章的內容整理成了pdf,想要pdf文件的能夠在公衆號後臺回覆關鍵字:pandas03。
更多Pandas知識見:輕鬆玩轉Pandas