目錄
一、缺失值處理
1.1 缺失值的識別
1.2 刪除缺失值
1.3 填充缺失值
二、異常值檢測
2.1 異常值的定義
2.2 常用檢測方法
IQR(四分位數間距)法
Z-score(標準分數)法
三、實戰案例:基因表達數據預處理
四、總結
數據分析過程中,數據的質量直接影響分析結果的可靠性。缺失值和異常值是兩類常見的數據問題,如果不及時處理,可能會導致模型偏差、誤判或不穩定的結果。本文將詳細介紹如何使用Pandas對數據中的缺失值進行處理,以及如何檢測并處理異常值,幫助你構建更為健壯的數據預處理流程。
一、缺失值處理
1.1 缺失值的識別
在Pandas中,缺失值通常由NaN
表示。我們可以利用內置方法快速識別數據中缺失值的分布和數量。
示例代碼:
import?pandas?as?pd import?numpy?as?np# 構造示例DataFrame data?=?{'A': [1,?2,?np.nan,?4,?5],'B': [5,?np.nan,?np.nan,?8,?10],'C': [np.nan,?2,?3,?4,?5] } df?=?pd.DataFrame(data) print("原始數據:") print(df)# 檢查每一列缺失值數量 print("\n缺失值統計:") print(df.isnull().sum())
原始數據:A ? ? B ? ?C 0 ?1.0 ? 5.0 ?NaN 1 ?2.0 ? NaN ?2.0 2 ?NaN ? NaN ?3.0 3 ?4.0 ? 8.0 ?4.0 4 ?5.0 ?10.0 ?5.0缺失值統計: A ? ?1 B ? ?2 C ? ?1 dtype: int64
1.2 刪除缺失值
如果缺失值比例較小或缺失行/列對分析影響不大,可以使用dropna()
方法刪除缺失值。
示例代碼:
# 刪除含有缺失值的行 df_drop_rows?=?df.dropna() print("\n刪除含有缺失值的行后的數據:") print(df_drop_rows)# 刪除含有缺失值的列 df_drop_columns?=?df.dropna(axis=1) print("\n刪除含有缺失值的列后的數據:") print(df_drop_columns)
刪除含有缺失值的行后的數據:A ? ? B ? ?C 3 ?4.0 ? 8.0 ?4.0 4 ?5.0 ?10.0 ?5.0刪除含有缺失值的列后的數據: Empty DataFrame Columns: [] Index: [0, 1, 2, 3, 4]
1.3 填充缺失值
有時候刪除缺失值會導致數據量驟減,此時可以考慮填充缺失值。常用方法包括使用均值、中位數、前一個有效值等進行填充。
示例代碼:
# 使用每列均值填充缺失值 df_filled_mean?=?df.fillna(df.mean()) print("\n使用均值填充缺失值后的數據:") print(df_filled_mean)# 使用前向填充方法填充缺失值 df_filled_ffill?=?df.fillna(method='ffill') print("\n使用前向填充后的數據:") print(df_filled_ffill)
使用均值填充缺失值后的數據:A ? ? ? ? ?B ? ?C 0 ?1.0 ? 5.000000 ?3.5 1 ?2.0 ? 7.666667 ?2.0 2 ?3.0 ? 7.666667 ?3.0 3 ?4.0 ? 8.000000 ?4.0 4 ?5.0 ?10.000000 ?5.0使用前向填充后的數據:A ? ? B ? ?C 0 ?1.0 ? 5.0 ?NaN 1 ?2.0 ? 5.0 ?2.0 2 ?2.0 ? 5.0 ?3.0 3 ?4.0 ? 8.0 ?4.0 4 ?5.0 ?10.0 ?5.0
二、異常值檢測
2.1 異常值的定義
異常值通常是指與其他數據相比顯著偏離的數據點。它們可能由測量錯誤、數據錄入錯誤或真實的罕見現象引起。檢測并處理異常值對于避免模型誤判十分關鍵。
2.2 常用檢測方法
IQR(四分位數間距)法
IQR方法利用數據的四分位數來識別異常值:
-
計算第一四分位數(Q1)和第三四分位數(Q3)。
-
IQR = Q3 - Q1
-
通常認為低于?
Q1 - 1.5*IQR
?或高于?Q3 + 1.5*IQR
?的數據為異常值。
示例代碼:
# 構造示例數據 data_outliers?=?{'Value': [10,?12,?11,?13,?100,?12,?11,?14,?10,?13] } df_outliers?=?pd.DataFrame(data_outliers)# 計算四分位數和IQR Q1?=?df_outliers['Value'].quantile(0.25) Q3?=?df_outliers['Value'].quantile(0.75) IQR?=?Q3?-?Q1print("Q1: {:.2f}, Q3: {:.2f}, IQR: {:.2f}".format(Q1,?Q3,?IQR))# 定義異常值檢測條件 lower_bound?=?Q1?-?1.5?*?IQR upper_bound?=?Q3?+?1.5?*?IQRprint("異常值下界:{:.2f}, 上界:{:.2f}".format(lower_bound,?upper_bound))# 篩選非異常值數據 df_no_outliers?=?df_outliers[(df_outliers['Value']?>=?lower_bound)?&?(df_outliers['Value']?<=?upper_bound)] print("\n去除異常值后的數據:") print(df_no_outliers)
Q1: 11.00, Q3: 13.00, IQR: 2.00 異常值下界:8.00, 上界:16.00去除異常值后的數據:Value 0 ? ? 10 1 ? ? 12 2 ? ? 11 3 ? ? 13 5 ? ? 12 6 ? ? 11 7 ? ? 14 8 ? ? 10 9 ? ? 13
Z-score(標準分數)法
Z-score方法基于均值和標準差,將數據標準化后檢測偏離較遠的點。通常,當Z-score大于3或小于-3時,認為該數據點為異常值。
示例代碼:
from scipy import stats# 計算Z-score df_outliers['Z_score'] = stats.zscore(df_outliers['Value'])# 篩選Z-score在-3到3之間的數據 df_no_outliers_z = df_outliers[(df_outliers['Z_score'] > -3) & (df_outliers['Z_score'] < 3)] print("\n使用Z-score方法去除異常值后的數據:") print(df_no_outliers_z)
使用Z-score方法去除異常值后的數據:Value ? Z_score 0 ? ? 10 -0.400060 1 ? ? 12 -0.324577 2 ? ? 11 -0.362318 3 ? ? 13 -0.286835 4 ? ?100 ?2.996675 5 ? ? 12 -0.324577 6 ? ? 11 -0.362318 7 ? ? 14 -0.249094 8 ? ? 10 -0.400060 9 ? ? 13 -0.286835
注意:在使用Z-score方法時,數據應近似服從正態分布;對于偏態分布的數據,IQR方法可能更為合適。
三、實戰案例:基因表達數據預處理
假設我們在基因表達數據中不僅存在缺失值,還包含一些測量異常的表達值。下面展示如何將上述方法應用到實際數據中。
示例數據文件:gene_expression.csv
Gene,Condition,Sample_A,Sample_B,Sample_C Gene1,Treated,20,25,30 Gene2,Control,15,NA,18 Gene3,Treated,22,20,21 Gene4,Control,100,17,19 ?# 這里的100為異常值
實戰代碼:
# 讀取數據 df_expr = pd.read_csv('gene_expression.csv', header=0, na_values=['NA'])# 將基因名稱設為索引 df_expr.set_index('Gene', inplace=True) print("原始基因表達數據:") print(df_expr)# 1. 缺失值處理:使用每列均值填充缺失值 df_expr.fillna(df_expr.mean(), inplace=True) print("\n填充缺失值后的數據:") print(df_expr)# 2. 異常值檢測:以Sample_A列為例,使用IQR方法檢測異常值 Q1 = df_expr['Sample_A'].quantile(0.25) Q3 = df_expr['Sample_A'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQRprint("\nSample_A列 - Q1: {:.2f}, Q3: {:.2f}, IQR: {:.2f}".format(Q1, Q3, IQR)) print("Sample_A列 - 異常值下界:{:.2f}, 上界:{:.2f}".format(lower_bound, upper_bound))# 篩選非異常值數據 df_expr_no_outliers = df_expr[(df_expr['Sample_A'] >= lower_bound) & (df_expr['Sample_A'] <= upper_bound)] print("\n去除Sample_A列異常值后的數據:") print(df_expr_no_outliers)
原始基因表達數據:Condition ?Sample_A ?Sample_B ?Sample_C Gene ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? Gene1 ? Treated ? ? ? ?20 ? ? ?25.0 ? ? ? ?30 Gene2 ? Control ? ? ? ?15 ? ? ? NaN ? ? ? ?18 Gene3 ? Treated ? ? ? ?22 ? ? ?20.0 ? ? ? ?21 Gene4 ? Control ? ? ? 100 ? ? ?17.0 ? ? ? ?19填充缺失值后的數據:Condition ?Sample_A ? Sample_B ?Sample_C Gene ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Gene1 ? Treated ? ? ? ?20 ?25.000000 ? ? ? ?30 Gene2 ? Control ? ? ? ?15 ?20.666667 ? ? ? ?18 Gene3 ? Treated ? ? ? ?22 ?20.000000 ? ? ? ?21 Gene4 ? Control ? ? ? 100 ?17.000000 ? ? ? ?19Sample_A列 - Q1: 18.75, Q3: 41.50, IQR: 22.75 Sample_A列 - 異常值下界:-15.38, 上界:75.62去除Sample_A列異常值后的數據:Condition ?Sample_A ? Sample_B ?Sample_C Gene ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Gene1 ? Treated ? ? ? ?20 ?25.000000 ? ? ? ?30 Gene2 ? Control ? ? ? ?15 ?20.666667 ? ? ? ?18 Gene3 ? Treated ? ? ? ?22 ?20.000000 ? ? ? ?21
四、總結
在數據預處理中,去除缺失值和檢測異常值是確保數據質量的關鍵步驟。通過Pandas提供的方法,我們可以快速識別并處理缺失數據;利用IQR和Z-score方法,我們可以檢測并剔除明顯偏離的數據點,從而為后續分析和建模打下堅實的基礎。掌握這些技巧不僅能提高數據分析的準確性,也有助于構建更加穩健的分析流程。
歡迎大家在評論區分享你們在實際應用中的經驗和問題,進一步探討數據預處理中的最佳實踐!
-
- AIDD learning 便捷查看
-
方式1:(免費獲取)轉發此文章至朋友圈(所有人可見,獲6個贊)或者3個群,并附“推薦關注學習”,1小時后將截圖發送后臺留言:2025312pandas。本人會在24小時內回復您獲取資料。