處理python中的缺失值常用方法包括識(shí)別、刪除和填充。首先使用df.isnull().sum()或missingno庫識(shí)別缺失值;其次若缺失比例高可用df.dropna()刪除行或列;最后可用fillna()填充,如固定值、前后向填充、均值中位數(shù)眾數(shù)填充及插值法;此外可提取是否缺失作為新特征或使用多重插補(bǔ)法提升精度。
處理python中的缺失值是數(shù)據(jù)清洗中最常見的任務(wù)之一。如果不妥善處理,缺失值會(huì)影響分析結(jié)果甚至導(dǎo)致模型訓(xùn)練失敗。常用的工具包括pandas庫,它提供了多種靈活的方法來識(shí)別、刪除或填充缺失值。
識(shí)別缺失值
在進(jìn)行任何操作之前,首先要確認(rèn)數(shù)據(jù)中是否存在缺失值。Pandas使用NaN(Not a number)表示缺失值,可以通過以下方法檢查:
- 使用 isnull().sum() 可以快速查看每一列的缺失值數(shù)量。
- 使用 isnull().any() 判斷是否有缺失值存在。
- 如果想可視化缺失值分布,可以用 missingno 庫生成矩陣圖或條形圖,這對(duì)判斷缺失模式很有幫助。
例如:
立即學(xué)習(xí)“Python免費(fèi)學(xué)習(xí)筆記(深入)”;
import pandas as pd df = pd.read_csv('data.csv') print(df.isnull().sum())
刪除缺失值
如果某列或某行缺失比例很高(比如超過80%),直接刪除可能是最省事的做法。Pandas的dropna()函數(shù)可以實(shí)現(xiàn)這個(gè)功能。
常用方式包括:
- df.dropna():默認(rèn)刪除所有包含缺失值的行。
- df.dropna(axis=1):刪除含有缺失值的列。
- df.dropna(thresh=5):保留至少有5個(gè)非空值的行。
不過要注意,這種方式可能會(huì)丟失大量有效數(shù)據(jù),因此只建議在缺失嚴(yán)重或?qū)Ψ治鲇绊懖淮蟮那闆r下使用。
填充缺失值
更常見的做法是用某種方式“補(bǔ)全”缺失值。Pandas的fillna()函數(shù)非常靈活,支持多種填充策略:
-
固定值填充:如用0或某個(gè)特定字符串填充,適用于已知默認(rèn)值的情況。
df.fillna(0, inplace=True)
-
前向填充或后向填充:適合時(shí)間序列數(shù)據(jù),用前面或后面的值填補(bǔ)。
df.fillna(method='ffill', inplace=True) # 前向填充
-
均值、中位數(shù)、眾數(shù)填充:數(shù)值型數(shù)據(jù)常用平均值或中位數(shù),類別型數(shù)據(jù)則用眾數(shù)。
df['age'].fillna(df['age'].mean(), inplace=True)
-
插值法:比如線性插值、多項(xiàng)式插值等,適合連續(xù)型數(shù)據(jù)。
df.interpolate(method='linear', inplace=True)
這些方法各有優(yōu)劣,具體選哪種要看數(shù)據(jù)特征和業(yè)務(wù)背景。
高級(jí)技巧與注意事項(xiàng)
有時(shí)候缺失本身也攜帶信息,這時(shí)候可以把是否缺失作為一個(gè)特征提取出來。
舉個(gè)例子,如果你的數(shù)據(jù)集中“收入”字段有很多缺失,但你知道某些群體更容易不填寫收入信息,那么你可以創(chuàng)建一個(gè)新列income_missing來標(biāo)記是否缺失:
df['income_missing'] = df['income'].isnull().astype(int)
這樣即使你后面用0填充了income,模型也能知道哪些是原始缺失的數(shù)據(jù)。
此外,多重插補(bǔ)(Multiple Imputation)也是一種進(jìn)階方法,比如使用sklearn的SimpleImputer或者fancyimpute庫中的算法進(jìn)行更精確的填補(bǔ)。
基本上就這些方法了。缺失值處理看似簡(jiǎn)單,但實(shí)際應(yīng)用時(shí)需要結(jié)合數(shù)據(jù)情況和分析目標(biāo)仔細(xì)考慮,否則很容易忽略關(guān)鍵細(xì)節(jié)。