在數(shù)據(jù)分析和機(jī)器學(xué)習(xí)中,缺失值是一種常見(jiàn)的現(xiàn)象。在實(shí)際數(shù)據(jù)集中,某些變量的某些條目可能沒(méi)有可用的值。處理缺失值是一個(gè)重要的數(shù)據(jù)預(yù)處理步驟。在本文中,我們將介紹如何在 Pandas 中處理缺失值。我們將探討以下內(nèi)容:
缺失值是指數(shù)據(jù)集中某些變量的某些條目缺少值。這些條目可以是空值、NaN(不是數(shù)字)或其他標(biāo)記。缺失值可能是由于數(shù)據(jù)輸入錯(cuò)誤、數(shù)據(jù)丟失或其他原因?qū)е碌?。在分析?shù)據(jù)集時(shí),缺失值可能會(huì)影響結(jié)果,因此需要對(duì)其進(jìn)行處理。在 Pandas 中,缺失數(shù)據(jù)由兩個(gè)值表示:None:None 通常用于 Python 代碼中的缺失數(shù)據(jù),NaN :NaN(Not a Number 的首字母縮寫(xiě)詞)。
在 Pandas 中,我們可以使用 isnull() 或 notnull() 函數(shù)來(lái)識(shí)別缺失值。不同之處在于,isnull()函數(shù)發(fā)現(xiàn)數(shù)據(jù)中有空值或缺失值的時(shí)候返回True,notnull()返回的是False。 這些函數(shù)返回一個(gè)布爾數(shù)組,該數(shù)組指示每個(gè)元素是否為空值。例如,假設(shè)我們有一個(gè)數(shù)據(jù)框 df,我們可以使用以下代碼檢查缺失值。
import pandas as pd # 創(chuàng)建一個(gè)包含缺失值的數(shù)據(jù)框 df = pd.DataFrame({'A': [1, 2, None, 4, None], 'B': [5, None, 7, 8, None]}) # 檢查數(shù)據(jù)框中的缺失值 print(df.isnull()) df
輸出結(jié)果為,如下在第3行第1列和第2行第2列存在缺失值。
A B 0 False False 1 False True 2 True False 3 False False 4 True True Out[2]: A B 0 1.0 5.0 1 2.0 NaN 2 NaN 7.0 3 4.0 8.0
上述代碼將檢查 df 數(shù)據(jù)框中的缺失值,并返回一個(gè)布爾數(shù)組,該數(shù)組指示每個(gè)元素是否為空值。True 表示該元素是一個(gè)缺失值。
在處理缺失值時(shí),我們有許多方法可供選擇。下面是一些常見(jiàn)的方法,函數(shù)形式:dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
刪除缺失值是處理缺失值的最簡(jiǎn)單方法之一。我們可以使用 dropna() 函數(shù)從數(shù)據(jù)框中刪除包含缺失值的行或列。例如,如果我們希望刪除包含任何缺失值的行,我們可以使用以下代碼,其中how默認(rèn)參數(shù)為'any'。
# 刪除包含任何缺失值的行 df.dropna()
刪除時(shí),有一個(gè)how參數(shù)介紹如下:
how:篩選方式。'any’,表示該行/列只要有一個(gè)以上的空值,就刪除該行/列;'all’,表示該行/列全部都為空值,就刪除該行/列。
我們可以使用以下代碼,其中參數(shù)all表示該行/列全部都為空值,就刪除該行/列。
# 刪除的行和列必須都為空值 df.dropna(how='all')
如下所示,第一行代碼將所有存在空值的行刪除,而第二行代碼只是將最后一行全空的值刪除。
如果我們希望只要出現(xiàn)缺失值,就刪除所在的行,我們可以使用以下代碼,設(shè)置參數(shù)為'any’。
# 只要出現(xiàn)缺失值,就刪除 df.dropna(how='any')
如果我們希望刪除包含缺失值的列,我們可以使用以下代碼:
# 刪除包含缺失值的列 df.dropna(axis=1)
如下所示,其中df是原始的值,運(yùn)行結(jié)果如下可對(duì)照結(jié)果進(jìn)行分析。
替換缺失值是處理缺失值的另一種常見(jiàn)方法。我們可以使用 fillna() 函數(shù)將缺失值替換為其他值。例如,如果我們希望將缺失值替換為 0,我們可以使用以下代碼:
# 將缺失值替換為 0 df.fillna(0)
我們還可以使用其他值來(lái)替換缺失值。例如,我們可以使用以下代碼將缺失值替換為每列的平均值:
# 將缺失值替換為每列的平均值 df.fillna(df.mean())
兩處代碼的運(yùn)行結(jié)果如下所示,分別對(duì)應(yīng)原始值、缺失值替換。
插值是一種更高級(jí)的缺失值處理方法。它可以使用現(xiàn)有數(shù)據(jù)來(lái)推斷缺失值。我們可以使用 interpolate() 函數(shù)在 Pandas 中進(jìn)行插值。例如,我們可以使用以下代碼在每列上進(jìn)行線性插值:
# 線性插值 df.fillna(df.interpolate())
下面是完整的在 Pandas 中處理缺失值的代碼示例:
import pandas as pd # 創(chuàng)建一個(gè)包含缺失值的數(shù)據(jù)框 df = pd.DataFrame({'A': [1, 2, None, 4], 'B': [5, None, 7, 8]}) # 檢查數(shù)據(jù)框中的缺失值 print(df.isnull()) # 刪除包含任何缺失值的行 print(df.dropna()) # 刪除整行都是缺失值的行 print(df.dropna(how='all')) # 刪除包含任何缺失值的行 df.dropna(how='any') # 刪除包含缺失值的列 print(df.dropna(axis=1)) # 將缺失值替換為 0 print(df.fillna(0)) # 將缺失值替換為每列的平均值 print(df.fillna(df.mean())) # 線性插值 print(df.interpolate()) print(df.fillna(df.interpolate()))
如上所示,我們先介紹了如何在 Pandas 中處理缺失值。我們討論了如何識(shí)別缺失值,并介紹了處理缺失值的常見(jiàn)方法。我們還提供了一些代碼示例,以便您可以在自己的項(xiàng)目中使用。處理缺失值是數(shù)據(jù)預(yù)處理的重要步驟,等下我們?cè)俳榻B一些高級(jí)的缺失值處理方法。
除了前面提到的基本缺失值處理方法,還有一些高級(jí)缺失值處理方法,可以進(jìn)一步提高數(shù)據(jù)處理的精度。
多重插補(bǔ)是一種使用現(xiàn)有數(shù)據(jù)集中其他相關(guān)變量的信息來(lái)推斷缺失值的方法。在 Pandas 中,我們可以使用 fancyimpute 庫(kù)來(lái)執(zhí)行多重插補(bǔ)。以下是一個(gè)示例,結(jié)果也如下所示。
from fancyimpute import IterativeImputer # 創(chuàng)建一個(gè)包含缺失值的數(shù)據(jù)框 df = pd.DataFrame({'A': [1, 2, None, 4,None], 'B': [5, None, 7, 8, None]}) # 使用多重插補(bǔ) imputer = IterativeImputer() imputed_df = imputer.fit_transform(df) imputed_df
對(duì)于更復(fù)雜的數(shù)據(jù)集,使用高級(jí)回歸模型可以進(jìn)一步提高缺失值處理的精度。例如,可以使用 XGBoost 或 LightGBM 等模型來(lái)處理缺失值。以下是一個(gè)使用 LightGBM 處理缺失值的示例:
import lightgbm as lgb # 創(chuàng)建一個(gè)包含缺失值的數(shù)據(jù)框 df = pd.DataFrame({'A': [1, 2, None, 4,None], 'B': [5, None, 7, 8, None]}) # 定義 LightGBM 模型 params = { 'objective': 'regression', 'metric': 'mse', 'num_leaves': 5, 'learning_rate': 0.05, 'feature_fraction': 0.5 } # 使用 LightGBM 處理缺失值 dtrain = lgb.Dataset(df.drop('A', axis=1), label=df['A'].dropna()) gbm = lgb.train(params, dtrain) df['A'] = gbm.predict(df.drop('A', axis=1))
當(dāng)然這個(gè)代碼我們還在調(diào)試中呀,可以自己復(fù)制運(yùn)行下~只有自己寫(xiě)了才會(huì)更加熟悉代碼呀。
在數(shù)據(jù)處理中,處理缺失值是非常重要的。在 Pandas 中,我們可以使用多種方法來(lái)處理缺失值,包括刪除包含缺失值的行或列、替換缺失值和插值缺失值等基本方法。此外,我們還可以使用多重插補(bǔ)和高級(jí)回歸模型等高級(jí)方法來(lái)提高缺失值處理的精度。希望本文能夠幫助更好地處理缺失值,提高數(shù)據(jù)處理的效率和精度。
聯(lián)系客服