數據分析 —— 數據預處理

一、什么是數據預處理

數據預處理(Data Preprocessing)是數據分析和機器學習中至關重要的步驟,旨在將原始數據轉換為更高質量、更適合分析或建模的形式。由于真實世界的數據通常存在不完整、不一致、噪聲或冗余等問題,預處理可以幫助提高數據的可用性和模型的性能。


數據預處理的主要步驟

  1. 數據清洗(Data Cleaning)

    • 處理缺失值:填充(均值、中位數、眾數等)、刪除缺失樣本或字段。

    • 處理噪聲數據:平滑或剔除異常值(如使用分箱、聚類或統計方法)。

    • 糾正不一致數據:統一格式(如日期格式、單位)、修正邏輯錯誤。

  2. 數據集成(Data Integration)

    • 合并多個數據源,解決冗余、沖突或重復問題(例如同名不同義的字段)。

  3. 數據變換(Data Transformation)

    • 標準化(Standardization):將數據縮放到均值為0、標準差為1(如Z-score)。

    • 歸一化(Normalization):將數據縮放到固定范圍(如[0,1])。

    • 離散化(Discretization):將連續數值分段(如年齡分為“青年”“中年”“老年”)。

    • 特征編碼:將分類變量轉換為數值(如獨熱編碼、標簽編碼)。

  4. 數據歸約(Data Reduction)

    • 降低數據規模,同時保留關鍵信息,例如:

      • 特征選擇:篩選重要特征(如相關系數、隨機森林重要性)。

      • 降維:使用主成分分析(PCA)、t-SNE等方法壓縮維度。

  5. 數據分箱(Binning)

    • 將連續值劃分為區間,減少噪聲影響(如將收入分為“低、中、高”)。


數據預處理的目的

  • 提高數據質量:消除噪聲、錯誤和不一致性。

  • 提升模型性能:通過標準化、歸一化等手段優化數據分布。

  • 減少計算成本:降維和歸約可加速模型訓練。

  • 適配算法需求:許多算法對輸入數據的格式和范圍敏感(如神經網絡需要歸一化)。


舉例說明

  • 原始數據問題:某用戶年齡字段包含“-1”(異常值),收入字段有缺失。

  • 預處理后:刪除“-1”,用中位數填充缺失值,并對收入進行歸一化處理。

數據預處理是數據科學流程中不可或缺的環節,直接影響最終結果的可靠性和模型效果。

二、數據檢測

1.準備數據

2.查看NaN值

方法一:

isnull():是查看數據是否存在NaN值,如果有則返回True

方法二:

notnull():是查數據是否不存在NaN值,如果不存在則返回True

三、缺失值處理

1.查看缺失值的占比

2.提取出完整的數據

這里使用另外一組數據

3.清除全空值

  • dropna?是 Pandas 中 DataFrame 的一個方法,用于刪除包含缺失值(NaN)的行或列,目的是清理數據中的無效缺失信息。
  • how?是?dropna?方法的一個參數,用于指定刪除行或列的條件:
    • 當?how='any'?時,只要行或列中?存在任意一個?NaN,就刪除該行或列。
    • 當?how='all'?時,僅當行或列中?所有值都為?NaN?時,才刪除該行或列。

4.篩選非空值數

5.某一列 = NaN,刪除整行數據

6.缺失值的替換處理

7.缺失值的填充處理

  • fillna?是 Pandas 中 DataFrame 的一個方法,用于填充數據中的缺失值(NaN),其常見屬性(參數)包括?value(填充的具體值)、method(填充方法)、axis(指定軸,0?或?'index'?表示行,1?或?'columns'?表示列)等。
  • method?是?fillna?方法的一個參數,用于指定填充缺失值的具體方法:
    • 'ffill'forward - fill?的縮寫)表示向前填充,即用缺失值前面(按指定軸方向)的非缺失值來填充當前缺失值。例如,若按行方向(axis=0),則用同一列中上方的非缺失值填充下方缺失值;若按列方向(axis=1),則用同一行中前方的非缺失值填充后方缺失值。
    • 另一種常見值是?'bfill'backward - fill?的縮寫),表示向后填充,即用缺失值后面(按指定軸方向)的非缺失值來填充當前缺失值。

因為是向上填充,第一行已是最初數據,無法填充?

向下填充

四、重復值處理

1.查看重復值

2.刪除重復值數據

五、異常值處理

1.異常值替換

存在23和50替換成3和2

2.三西格瑪法則

three_sigma(df_obj['A']):對?df_obj?數據框中的?'A'?列應用?three_sigma?函數,輸出為?6 30 Name: A, dtype: int64,表明?'A'?列中存在符合三西格瑪法則判定的異常值(這里顯示為?6?和?30)。

three_sigma(df_obj['B']):對?df_obj?數據框中的?'B'?列應用該函數,輸出為?Series([], Name: B, dtype: int64),表示?'B'?列中沒有符合三西格瑪法則判定的異常值,返回一個空的 Series。

3.箱形圖檢測

六、數據合并

維度橫向堆疊(列合并)縱向堆疊(行合并)
方向左右擴展(新增列)上下擴展(新增行)
核心操作JOIN(內連接、外連接等)、mergeconcat(axis=1)UNIONUNION ALLconcat(axis=0)
關鍵條件需通過 “鍵” 對齊列(可能存在列名沖突)需列結構一致(列數、列名相同或可自動對齊)
連接策略外連接(橫向操作)內連接(橫向操作)
保留記錄至少一個表的所有記錄,未匹配列填?NULL僅保留兩表連接鍵完全匹配的記錄
典型場景保留所有數據(如客戶全量信息,無論是否有消費記錄)篩選交集數據(如同時存在于兩個表中的用戶)

總結

  • 橫向堆疊是列合并,外連接是橫向合并時保留非匹配記錄的策略;
  • 縱向堆疊是行合并,與內連接無直接關聯(內連接屬于橫向合并的匹配策略)。
  • 混淆點:內連接本質是橫向操作(列合并 + 篩選行),而縱向堆疊是單純的行追加,兩者分屬不同數據合并維度。
pd.concat(objs,                # 需要合并的對象列表(DataFrame/Series)axis=0,              # 合并方向:0=縱向(默認),1=橫向join='outer',        # 連接方式:'outer'(默認)外連接(并集)或 'inner'內連接(交集)ignore_index=False,  # 是否重置索引keys=None,           # 創建多層索引sort=False,          # 是否對列排序(axis=1 時)verify_integrity=False  # 是否檢查重復索引
)

1.橫向堆疊與外連接(并集)

2.縱向堆疊與內連接(交集)

3.主鍵合并

pd.merge(left,                # 左側 DataFrameright,               # 右側 DataFramehow='inner',         # 連接方式:'inner'(默認)、'outer'、'left'、'right'on=None,             # 用于連接的列名(必須同時存在于左右 DataFrame 中)left_on=None,        # 左側 DataFrame 中用于連接的列right_on=None,       # 右側 DataFrame 中用于連接的列left_index=False,    # 是否使用左側 DataFrame 的索引作為鍵right_index=False,   # 是否使用右側 DataFrame 的索引作為鍵suffixes=('_x', '_y') # 用于區分重復列的后綴
)

與其他合并函數的對比

函數核心特點適用場景
pd.merge()按鍵連接,支持多種連接類型(SQL 風格)基于共同列合并數據
pd.concat()按行 / 列堆疊,支持多層索引快速合并同結構數據
df.join()基于索引的快速合并(默認左連接)按索引合并多個 DataFrame

內連接規則:僅保留?'key'?列在兩表中都存在的值(K0?和?K2),以 left 的 key 為主,找共同有的元素

4.笛卡爾連接

關鍵點:on=‘key’

5.左連接合并

6.根據索引合并

為什么C和D的值的NaN?因為 right?的標簽的 abc,不是012

7.合并重疊數據

基本語法

df1.combine_first(df2)  # 用 df2 的值填充 df1 的缺失值

注意:right的標簽順序

七、數據重塑

方法轉換方向作用
stack()列 → 行(寬 → 長)將列標簽轉為行索引(多級索引)
unstack()行 → 列(長 → 寬)將行索引轉為列標簽(常用于逆操作)
melt()多列 → 兩列(id_vars + value_vars)將指定列保留為標識符,其余列轉為值列

1.stack()方法

2.unstack()方法

3.重塑旋轉

future_stack=True?是 Pandas 2.1.0 版本引入的一個參數,用于啟用?stack()?方法的新實現邏輯。這個參數的出現是為了平滑過渡到未來版本中默認的?stack()?行為,避免舊代碼在升級后產生意外結果。

新舊實現的核心差異

場景舊實現( 默認 stack() )新實現 stack(future_stack=True)
處理缺失值(NaN)可能靜默丟棄或保留?NaN,取決于索引對齊方式嚴格保留所有索引,未匹配的值用?NaN?填充
多級索引堆疊行為較寬松,可能導致索引層級混亂強制保持索引層級的一致性,避免潛在的歧義
重復列名處理允許重復列名,堆疊后可能生成重復的索引強制要求列名唯一(否則拋出?ValueError
性能優化某些情況下可能較慢優化了內存使用和計算效率

level=1?表示對列索引的第二層(“A 教室”“B 教室” 這一層)進行堆疊

關鍵差異總結

參數堆疊層級結果索引層級列維度保留情況
level=-1(默認)所有列索引層級原行索引 + 所有列層級無(全部轉為行)
level=1僅第 1 層列索引原行索引 + 第 1 層列索引第 0 層列索引保留為列

核心作用

  • 列轉行:將 DataFrame 中指定層級的列索引(若有多級列索引)移動到行索引,形成多級行索引。
  • 結構轉換:例如,原數據中某幾列代表不同分類的指標,堆疊后這些分類指標轉為行的一部分,數據整體更 “長” 更 “窄”。

4.軸向旋轉


pivot()?是數據處理中用于重塑數據結構的函數,常見于 Pandas 庫,作用類似 “透視表”,能將數據從長格式轉換為寬格式,便于分析。

Pandas 中?pivot()?的語法與參數

  • 語法pivot(index=None, columns=None, values=None) → DataFrame
  • 參數說明
    • index:指定一列作為新 DataFrame 的行索引。
    • columns:指定一列的值作為新 DataFrame 的列名(必須傳值)。
    • values:指定一列作為新 DataFrame 的值(可選,若省略,原 DataFrame 的列會保留在結果中)。

形成一個直觀的手機降價對比圖

八、數據轉換

1.面元劃分

pd.cut()?是 Pandas 庫中用于將連續型數值數據切分為離散區間(分箱)的函數,常用于數據預處理、分組分析或可視化。通過設定區間規則,它能將連續值轉換為分類數據(如將年齡分為 “青年”“中年”“老年”),便于進一步分析。

pd.cut()?是 Pandas 中用于將連續型數據劃分為離散區間(分箱)的函數,其參數說明如下:

  1. x

    • 輸入的一維數據(如?Series、數組或列表),是待分箱的數據源,必須為一維結構。
  2. bins

    • 定義分箱的依據,有三種形式:
      • 若為?整數,表示將數據等寬劃分為指定數量的區間(如?bins=3?表示分成 3 個等寬區間)。
      • 若為?序列(如?[10, 20, 30]),按指定邊界劃分區間(區間默認為左開右閉,如?(10,20])。
      • 若為?間隔索引IntervalIndex),需確保區間不重疊。
  3. right

    • 布爾值,默認為?True,表示區間是否包含右邊界。
      • 例:bins=[1,2,3]?且?right=True?時,區間為?(1,2](2,3];若?right=False,則為?[1,2)[2,3)
  4. labels

    • 為分箱指定標簽,需與分箱數量一致。
      • 若為?數組,標簽直接對應每個區間(如?labels=['低','中','高'])。
      • 若為?False,則返回數據所在區間的整數指示(如?0,1,2?表示第 1、2、3 個區間)。
  5. retbins

    • 布爾值,默認為?False。若設為?True,除返回分箱結果外,還會返回區間邊界。
  6. precision

    • 整數,默認?3,用于指定區間邊界的小數精度(如?precision=2?表示保留兩位小數)。
  7. include_lowest

    • 布爾值,默認為?False,表示區間左邊界是否閉合。
      • 例:bins=[10,20]?且?include_lowest=True?時,左區間為?[10,20](否則為?(10,20])。
  8. duplicates

    • 處理分箱臨界值重復的方式,可選?'raise'(默認,重復時報錯)或?'drop'(忽略重復邊界)。

2.啞變量處理

啞變量處理(Dummy Variable Treatment)是將分類變量(如性別、職業、商品類別等非數值型變量)轉換為若干個二元變量(取值為 0 或 1)的過程。其核心目的是將定性的分類信息轉化為數值形式,使機器學習、統計分析等模型能夠有效處理這些數據。例如,性別變量有 “男”“女” 兩類,可生成一個啞變量(1 代表男,0 代表女);若分類變量有n個類別,通常生成\(n-1\)個啞變量(以其中一個類別作為參照),避免多重共線性。

pd.get_dummies()?是 Pandas 中用于將分類變量轉換為啞變量(虛擬變量)的函數,其常見參數如下:

  1. data

    • 必選參數,輸入需要進行啞變量轉換的數據,支持?SeriesDataFrame?或類似數組(array-like)的結構。
  2. prefix

    • 可選參數,用于定義啞變量列名的前綴。可以是字符串、字符串列表或字典(鍵為列名,值為對應前綴)。例如,設置?prefix='cat',生成的啞變量列名可能為?cat_類別1cat_類別2
  3. prefix_sep

    • 可選參數,默認為?'_',用于連接前綴和原始列名(當前綴存在時)。如?prefix='cat'?且?prefix_sep='/',列名可能為?cat/類別1
  4. dummy_na

    • 可選參數,布爾值,默認為?False。若設為?True,會為缺失值(NaN)單獨生成一列(值為?1?表示該樣本為缺失值,否則為?0)。
  5. columns

    • 可選參數,指定需要進行啞變量編碼的列。若為?None(默認),則對所有?objectstring?或?category?數據類型的列進行轉換。
  6. sparse

    • 可選參數,布爾值,默認為?False。若設為?True,返回的啞變量數據將以稀疏矩陣形式存儲,用于節省內存(適用于大量零值的場景)。
  7. drop_first

    • 可選參數,布爾值,默認為?False。若設為?True,會刪除每個分類變量的第一個類別對應的啞變量列,以避免多重共線性(常用于回歸分析等場景)。
  8. dtype

    • 可選參數,指定生成的啞變量列的數據類型(如?np.uint8bool?等),默認為?np.uint8

以下操作基于上面練習的實操,所需的兩個資源已經放在資源包里了

?九、預處理二手房數據(綜合案例)

1.查看數據1

2.查看數據2

3.數據統一

因為數據表的數據不一致

4.數據合并

5.缺失值處理

6.重復值處理

7.異常值處理

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80813.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Redis】哨兵(Sentinel)機制

文章目錄 1. Redis Sentinel的概念1.1 基本概念1.2 引出高可用 2. Redis Sentinel的部署(基于docker)2.1 部署2.2 驗證2.3 選舉流程 Redis 的主從復制模式下,?旦主節點由于故障不能提供服務,需要人工進行主從切換,同時…

初識Linux · 五種IO模型和非阻塞IO

目錄 前言: 五種IO模型 什么是IO IO模型 非阻塞IO 前言: 前文我們已經將網絡的基本原理介紹完了,都是通過圍繞TCP/IP四層協議,將應用層,傳輸層,網絡層,數據鏈路層全部介紹完畢&#xff0c…

Node.js 24發布:性能與安全雙提升

在科技的迅速發展中,Node.js作為一個備受青睞的開源跨平臺Java運行環境,近日迎來了其24.0版本的正式發布。此次更新不僅承諾提升性能和安全性,還為開發者提供了更為順暢的開發體驗,值得我們深入探討。 Node.js 24.0的最大亮點之一…

SLAM文獻之-SuperOdometry: Lightweight LiDAR-inertial Odometry and Mapping

《Super Odometry: IMU-centric LiDAR-Visual-Inertial Estimator for Challenging Environments》是一篇旨在增強 SLAM 系統在惡劣環境下魯棒性的工作,尤其關注塵霧、煙霧等遮擋條件下的魯棒估計。下面從算法原理、公式推導、創新點和應用場景四個方面進行詳細解析…

指令燒錄ORIN NANO操作系統

1 概述 模組為ORIN NANO 4GB版本 Ubuntu系統為18.04虛擬機 說明:刷機過程會有重新連接USB的操作,燒寫過程需要注意虛擬機提示,官方不建議使用虛擬機,建議直接使用ubuntu操作系統的機器。 2 下載燒錄所需文件 進入到下載網址&am…

游戲引擎學習第287天:加入brain邏輯

Blackboard:動態控制類似蛇的多節實體 我們目前正在處理一個關于實體系統如何以組合方式進行管理的問題。具體來說,是在游戲中實現多個實體可以共同或獨立行動的機制。例如,我們的主角擁有兩個實體組成部分,一個是身體&#xff0…

QML定時器Timer和線程任務WorkerScript

定時器 Timer 屬性 interval: 事件間隔毫秒repeat: 多次執行,默認只執行一次running: 定時器啟動triggeredOnStart: 定時器啟動時立刻觸發一次事件 信號 triggered(): 定時時間到,觸發此信號 方法 restart(): 重啟定時器start(): 啟動定時器stop(): 停止…

Linux中的域名解析服務器

一、DNS(域名系統)詳解 1. 核心功能與特點 特性說明核心作用將域名(如 www.example.com)轉換為 IP 地址(如 192.168.1.1),實現人類可讀地址與機器可讀地址的映射。端口與協議- 默認端口&#…

Springboot2

1、搭建環境 2、配置文件 application.properties application.yml 3、springboot接收請求 springspringmvc 接收請求 響應數據 4、springboot集成jdbc spring-boot-starter-jdbc.jar JdbcTemplate(update|query) 5、springboot自動裝配原理(重點&#x…

【課堂筆記】核方法和Mercer定理

文章目錄 Kernal引入定義Mercer定理描述有限情形證明一般情形證明 Kernal 引入 在實際數據中常常遇到不可線性分割的情況,此時通常需要將其映射到高維空間中,使其變得線性可分。例如二維數據: 通過映射 ? ( x 1 , x 2 ) ( x 1 2 , 2 x 1…

談談未來iOS越獄或巨魔是否會消失

2024年10月的預測,先說結論: 巨魔iOS17.1消失概率為99%。 因為巨魔強依賴的漏洞就是一個簽名漏洞,攻擊面有限又經過2輪修復,第3次出現漏洞的概率極低。而越獄的話由于系統組件和服務較多,所以出現漏洞概率高攻擊面多&…

根據當前日期計算并選取上一個月和上一個季度的日期范圍,用于日期控件的快捷選取功能

1.選擇月份范圍 代碼如下&#xff1a; <el-date-picker v-model"value" type"monthrange" align"right" unlink-panels range-separator"至"start-placeholder"開始月份" end-placeholder"結束月份" :picker-…

用戶棧的高效解析邏輯

一、背景 在之前的博客 內核邏輯里抓取用戶棧的幾種方法-CSDN博客 里&#xff0c;介紹了使用內核邏輯進行用戶棧的函數地址的抓取邏輯&#xff0c;但是并沒有涉及如何解析出函數符號的邏輯。 就如perf工具一樣&#xff0c;它也是分為兩個步驟&#xff0c;一個步驟是內核態抓取…

vue3 el-table 行號

在 Vue 3 中&#xff0c;使用 Element Plus 的 <el-table> 組件來創建表格時&#xff0c;如果你想添加行號&#xff08;即每一行的編號&#xff09;&#xff0c;可以通過自定義列來實現。下面是如何實現的步驟&#xff1a; 1. 安裝 Element Plus 首先&#xff0c;確保你…

Linux:進程信號---信號的保存與處理

文章目錄 1. 信號的保存1.1 信號的狀態管理 2. 信號的處理2.1 用戶態與內核態2.2 信號處理和捕捉的內核原理2.3 sigaction函數 3. 可重入函數4. Volatile5. SIGCHLD信號 序&#xff1a;在上一章中&#xff0c;我們對信號的概念及其識別的底層原理有了一定認識&#xff0c;也知道…

UML 圖的細分類別及其應用

統一建模語言&#xff08;UML&#xff0c;Unified Modeling Language&#xff09;是一種用于軟件系統建模的標準化語言&#xff0c;廣泛應用于軟件工程領域。UML 圖分為多種類別&#xff0c;每種圖都有其特定的用途和特點。本文將詳細介紹 UML 圖的細分類別&#xff0c;包括 類…

「極簡」扣子(coze)教程 | 小程序UI設計進階!控件可見性設置

大師兄在上一期的內容中對用戶的UI做了一些簡單的介紹。這期大師兄繼續介紹UI設計上的進階小技巧&#xff0c;幫我們獲得更好的使用體驗。 扣子&#xff08;coze&#xff09;編程 「極簡」扣子(coze)教程 | 3分鐘學會小程序UI設計&#xff01;從零開始創建頁面和瓷片按鈕 「極…

2025年滲透測試面試題總結-快手[實習]安全工程師(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 快手[實習]安全工程師 一面問題分析與詳細回答 1. 自我介紹 4. 項目問題與解決 7. 防止SQL注入&…

WordPress Madara插件存在文件包含漏洞(CVE-2025-4524)

免責聲明 本文檔所述漏洞詳情及復現方法僅限用于合法授權的安全研究和學術教育用途。任何個人或組織不得利用本文內容從事未經許可的滲透測試、網絡攻擊或其他違法行為。使用者應確保其行為符合相關法律法規,并取得目標系統的明確授權。 對于因不當使用本文信息而造成的任何直…

互聯網大廠Java面試場景:從Spring Boot到分布式緩存技術的探討

互聯網大廠Java面試場景&#xff1a;從Spring Boot到分布式緩存技術的探討 場景描述 互聯網大廠某次Java開發崗面試&#xff0c;主考官是一位嚴肅的技術專家&#xff0c;而應聘者則是搞笑的程序員“碼農明哥”。面試圍繞音視頻場景的技術解決方案展開&#xff0c;探討從Sprin…