Pandas缺失值處理


什么是缺失值?

  直觀上理解,缺失值表示的是“缺失的數據”

創建數據

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

識別出缺失值或非缺失值

# 識別缺失值
# True:缺失值
# False:非缺失值
user_info.isnull()

# 識別非缺失值
# True:非缺失值
# False:缺失值
user_info.notnull()

過濾掉一些缺失的行

# 過濾掉age為缺失值的行
user_info[user_info.age.notnull()]

丟棄缺失值

.dropna()

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: 一行/列所有值都為空時才丟棄。

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

    thresh:參數的類型為整數,比如 thresh=3,會在一行/列中至少有 3 個非空值時將其保留。

# 一行數據只要有一個字段存在空值即刪除
user_info.dropna(axis=0, how="any")
# 一行數據所有字段都為空值才刪除
user_info.dropna(axis=0, how="all")
# 一行數據中只要 city 或 sex 存在空值即刪除
user_info.dropna(axis=0, how="any", subset=["city", "sex"])

填充缺失值

  .fillna()

使用一個標量來填充

# 將有缺失的年齡都填充為0
user_info.age.fillna(0, inplace=True)
# 將有缺失的城市都填充為china
user_info.city.fillna("china")
# 注意:空格不會被代替

使用前一個或后一個有效值來填充

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

user_info.age.fillna(method="ffill")

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

user_info.age.fillna(method="backfill")

使用線性差值來填充

  .interpolate()

user_info.age.interpolate(inplace=True)

替換缺失值

  大家有沒有想過一個問題:到底什么才是缺失值呢?你可能會奇怪說,前面不是已經說過了么, None 、 np.nan 、 NaT 這些都是缺失值。但是我也說過了,這些在 Pandas 的眼中是缺失值,有時候在我們人類的眼中,某些異常值我們也會當做缺失值來處理
  例如,在我們的存儲的用戶信息中,假定我們限定用戶都是青年,出現了年齡為 40 的,我們就可以認為這是一個異常值。再比如,我們都知道性別分為男性(male)和女性(female),在記錄用戶性別的時候,對於未知的用戶性別都記為了 “unknown”,很明顯,我們也可以認為“unknown”是缺失值。此外,有的時候會出現空白字符串,這些也可以認為是缺失值

replace 方法:

# 將age = 40 的替換為NAN
user_info.age.replace(40, np.nan)

  對於 DataFrame,可以指定每列要替換的值:

user_info.replace({"age": 40, "birth": pd.Timestamp("1978-08-08")},np.nan)

將特定字符串進行替換

user_info.sex.replace("unknown", np.nan)

使用正則表達式來替換

#將空白字符串替換成空值
user_info.city.replace(r'\s+', np.nan, regex=True) 

使用其他對象填充

  將沒有缺失值的 Series 中的元素傳給有缺失值的

age_new = user_info.age.copy()
age_new.fillna(20, inplace=True)  
user_info.age.combine_first(age_new)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM