Pandas-數據清洗與處理

Pandas-數據清洗與處理

    • 一、數據清洗的核心目標
    • 二、缺失值處理
      • 1. 缺失值檢測
      • 2. 缺失值處理策略
        • (1)刪除法
        • (2)填充法
    • 三、異常值識別與處理
      • 1. 異常值檢測方法
        • (1)統計法
        • (2)業務規則法
      • 2. 異常值處理策略
    • 四、重復數據處理
      • 1. 重復數據檢測
      • 2. 重復數據處理
    • 五、數據格式轉換與標準化
      • 1. 日期時間格式轉換
      • 2. 文本數據清洗
      • 3. 數據類型轉換
    • 六、應用實例:完整數據清洗流程

數據清洗與處理往往占據最多的時間,現實世界中的數據很少是完美的——它們可能包含缺失值、異常值、重復記錄,或是格式混亂、命名不規范的字段。Pandas作為Python數據處理的瑞士軍刀,提供了強大而靈活的工具來應對這些問題。

一、數據清洗的核心目標

數據清洗的最終目的是提升數據質量,為后續分析和建模奠定基礎。具體來說,需要實現以下目標:

  • 完整性:處理缺失值,確保關鍵信息不缺失
  • 一致性:統一數據格式、命名規范和取值標準
  • 準確性:識別并修正異常值、錯誤數據
  • 唯一性:去除重復記錄,避免分析結果偏差
  • 可用性:將數據轉換為便于分析的結構(如日期類型、分類編碼)

圍繞這些目標,Pandas提供了從簡單到復雜的一系列處理函數,掌握它們的組合使用是高效清洗數據的關鍵。

二、缺失值處理

缺失值是數據清洗中最常見的問題,Pandas通過isnull()dropna()fillna()等函數形成完整的處理鏈條。

1. 缺失值檢測

首先需要定位缺失值的位置和比例:

import pandas as pd
import numpy as np# 讀取示例數據
df = pd.read_csv('messy_data.csv')# 檢測每列缺失值數量及比例
missing_count = df.isnull().sum()
missing_ratio = (missing_count / len(df)).round(3)
missing_df = pd.DataFrame({'缺失值數量': missing_count,'缺失比例': missing_ratio
})
print("缺失值統計:")
print(missing_df[missing_df['缺失值數量'] > 0])  # 只顯示有缺失的列

2. 缺失值處理策略

根據缺失比例和字段重要性,選擇不同的處理方式:

(1)刪除法

適用于缺失比例極高(如超過80%)或對分析無影響的字段,或缺失行數量極少的情況:

# 刪除缺失比例超過50%的列
threshold = len(df) * 0.5
df = df.dropna(thresh=threshold, axis=1)# 刪除關鍵字段(如用戶ID)缺失的行
df = df.dropna(subset=['user_id', 'order_date'])
(2)填充法

對于重要字段,需根據字段類型選擇合理的填充值:

# 數值型字段:用中位數填充(抗異常值能力強于均值)
df['amount'] = df['amount'].fillna(df['amount'].median())# 分類型字段:用眾數或特殊標記(如"未知")填充
df['category'] = df['category'].fillna(df['category'].mode()[0])
df['city'] = df['city'].fillna('未知城市')# 時間型字段:用前后值填充(適用于時間序列數據)
df['login_time'] = df['login_time'].fillna(method='ffill')  # 向前填充
df['logout_time'] = df['logout_time'].fillna(method='bfill')  # 向后填充# 分組填充:按類別分組后,用組內均值填充(更精準)
df['score'] = df.groupby('class')['score'].transform(lambda x: x.fillna(x.mean())
)

三、異常值識別與處理

異常值(離群點)會扭曲統計結果和模型訓練,需結合業務邏輯識別并處理。

1. 異常值檢測方法

(1)統計法

適用于數值型字段,通過四分位距(IQR)或標準差判斷:

def detect_outliers_iqr(df, col):"""用IQR法檢測異常值"""q1 = df[col].quantile(0.25)q3 = df[col].quantile(0.75)iqr = q3 - q1lower_bound = q1 - 1.5 * iqrupper_bound = q3 + 1.5 * iqrreturn (df[col] < lower_bound) | (df[col] > upper_bound)# 檢測"金額"字段的異常值
df['is_amount_outlier'] = detect_outliers_iqr(df, 'amount')
print(f"異常值比例:{df['is_amount_outlier'].mean():.2%}")
(2)業務規則法

基于領域知識判斷,如訂單金額不能為負、年齡不能超過150歲:

# 檢測金額為負的異常值
df['is_invalid_amount'] = df['amount'] < 0# 檢測年齡不合理的記錄
df['is_invalid_age'] = (df['age'] < 0) | (df['age'] > 150)

2. 異常值處理策略

# 1. 修正明顯錯誤(如金額為負可能是符號錯誤)
df.loc[df['amount'] < 0, 'amount'] = df.loc[df['amount'] < 0, 'amount'].abs()# 2. 截斷法(將異常值限制在合理范圍內)
q1, q3 = df['amount'].quantile([0.25, 0.75])
df['amount'] = df['amount'].clip(lower=q1 - 1.5 * (q3 - q1), upper=q3 + 1.5 * (q3 - q1))# 3. 標記法(保留異常值但標記,供后續分析)
df['age'] = df['age'].mask(df['age'] > 120, np.nan)  # 用NaN標記異常年齡,后續填充

四、重復數據處理

重復數據可能導致分析結果偏誤(如重復計算同一訂單),需檢測并去重。

1. 重復數據檢測

# 檢測完全重復的行
duplicate_rows = df.duplicated().sum()
print(f"完全重復的行數:{duplicate_rows}")# 檢測關鍵字段組合重復(如同一用戶同一時間的重復記錄)
duplicate_combo = df.duplicated(subset=['user_id', 'login_time'], keep=False).sum()
print(f"用戶-時間組合重復的記錄數:{duplicate_combo}")# 查看重復樣本
if duplicate_rows > 0:print("重復樣本示例:")print(df[df.duplicated(keep=False)].head())

2. 重復數據處理

# 保留第一次出現的記錄,刪除后續重復行
df = df.drop_duplicates(keep='first')# 對關鍵字段組合去重,并保留金額最大的記錄
df = df.sort_values('amount', ascending=False)  # 按金額降序排列
df = df.drop_duplicates(subset=['user_id', 'product_id'], keep='first')

五、數據格式轉換與標準化

原始數據常存在格式混亂問題(如日期格式不統一、文本大小寫混用),需標準化處理。

1. 日期時間格式轉換

日期字段若以字符串形式存儲,需轉換為datetime類型才能進行時間運算:

# 轉換日期字符串為datetime類型(支持多種格式自動識別)
df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')
# errors='coerce'將無效格式轉為NaT(缺失日期)# 提取日期中的年、月、周等信息
df['order_year'] = df['order_date'].dt.year
df['order_month'] = df['order_date'].dt.month
df['is_weekend'] = df['order_date'].dt.dayofweek.isin([5, 6])  # 判斷是否周末

2. 文本數據清洗

處理文本字段中的大小寫、空格、特殊字符等問題:

# 去除字符串前后空格
df['product_name'] = df['product_name'].str.strip()# 統一為小寫(適用于不區分大小寫的場景)
df['category'] = df['category'].str.lower()# 替換特殊字符(如將"手機_"和"手機("統一為"手機")
df['category'] = df['category'].str.replace(r'[_\(\)]', '', regex=True)# 提取文本中的數字(如從"價格:99元"中提取99)
df['price'] = df['price_text'].str.extract(r'(\d+)').astype(float)

3. 數據類型轉換

優化數據類型以減少內存占用,或滿足分析需求:

# 將字符串ID轉換為分類類型(適用于高基數但重復值多的字段)
df['user_id'] = df['user_id'].astype('category')# 將數值型字符串轉換為數值類型(如"100.5"→100.5)
df['amount'] = pd.to_numeric(df['amount_str'], errors='coerce')# 將布爾值轉換為0/1(便于某些模型處理)
df['is_vip'] = df['is_vip'].astype(int)

六、應用實例:完整數據清洗流程

def clean_data(df):"""完整的數據清洗函數"""print(f"原始數據形狀:{df.shape}")# 1. 缺失值處理print("\n=== 處理缺失值 ===")# 刪除無意義的高缺失列df = df.drop(columns=['unused_col1', 'unused_col2'])# 填充數值列和分類型列num_cols = df.select_dtypes(include=['int64', 'float64']).columnsfor col in num_cols:df[col] = df[col].fillna(df[col].median())cat_cols = df.select_dtypes(include=['object', 'category']).columnsfor col in cat_cols:df[col] = df[col].fillna(df[col].mode()[0] if not df[col].mode().empty else '未知')# 2. 異常值處理print("\n=== 處理異常值 ===")df['amount'] = df['amount'].clip(lower=0)  # 金額不能為負df['age'] = df['age'].mask((df['age'] < 0) | (df['age'] > 120), df['age'].median())# 3. 重復數據處理print("\n=== 處理重復數據 ===")df = df.drop_duplicates(subset=['order_id'], keep='first')# 4. 格式轉換print("\n=== 格式轉換 ===")df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')df['product_name'] = df['product_name'].str.strip().str.lower()print(f"清洗后數據形狀:{df.shape}")return df# 執行清洗流程
cleaned_df = clean_data(df)

總結:數據清洗的核心原則

  1. 理解業務:數據清洗的前提是理解字段含義和業務邏輯(如“年齡為負”在業務中一定是錯誤)。
  2. 保留痕跡:重要的修改(如異常值替換、缺失值填充)應記錄在日志中,確保可追溯。
  3. 分步驗證:每完成一步清洗,都需驗證結果(如檢查填充后是否還有缺失值)。
  4. 自動化復用:將清洗步驟封裝為函數,便于在新數據上重復使用,保證處理邏輯一致。

That’s all, thanks for reading~~
覺得有用就點個贊、收進收藏夾吧!關注我,獲取更多干貨~

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

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

相關文章

在 MacOS 上安裝和配置 Kafka

消息代理是一種軟件&#xff0c;充當在不同應用程序之間發送消息的中介。它的功能類似于服務器&#xff0c;從一個應用程序&#xff08;稱為生產者&#xff09;接收消息&#xff0c;并將其路由到一個或多個其他應用程序&#xff08;稱為消費者&#xff09;。消息代理的主要目的…

基于Leaflet調用天地圖在線API的多層級地名檢索實戰

目錄 前言 一、天地圖在線檢索 1、在線檢索功能 2、再談后后接口 二、Leaflet多層級實現實例 1、層級調用實現原理 2、Leaflet中多層級調用 3、成果展示 三、總結 前言 “地圖是世界的索引&#xff0c;而地名則是索引中的索引。”當互聯網地圖進入 Web 2.0 時代&#x…

基于Prompt結構的語校解析:3H日本語學校信息建模實錄(4/500)

基于Prompt結構的語校解析&#xff1a;3H日本語學校信息建模實錄&#xff08;4/500&#xff09; 系列延續&#xff1a;500所日本語言學校結構數據工程 關鍵詞&#xff1a;招生結構、JLPTEJU、國籍比例、認定校、Prompt訓練集 一、我們在構建什么樣的語言學校語料&#xff1f; …

Leaflet面試題及答案(61-80)

查看本專欄目錄 文章目錄 ?? 面試問題及答案(61-80)61. 如何在地圖上顯示一個動態更新的圖層?62. 如何實現地圖上的熱力圖(Heatmap)?63. 如何自定義地圖控件的位置?64. 如何處理地圖加載失敗的情況?65. 如何實現地圖的離線功能?66. 如何將地圖導出為圖片?67. 如何實…

MIG_IP核的時鐘系統

MIG_IP核的時鐘系統時鐘的種類和配置時鐘的種類和配置 整體框圖 DDR_PHY_CLK&#xff1a;DDR3的工作頻率&#xff0c;用來得到想要的線速率。假設此時鐘為800M&#xff0c;那么DDR雙沿采樣&#xff0c;線速率為1600Mbit&#xff1b; UI_CLK&#xff1a;DDR_PHY_CLK的四分之一…

若依框架集成阿里云OSS實現文件上傳優化

背景介紹 在若依框架目前的實現中&#xff0c;是把圖片存儲到了服務器本地的目錄&#xff0c;通過服務進行訪問&#xff0c;這樣做存儲的是比較省事&#xff0c;但是缺點也有很多&#xff1a; 硬件與網絡要求&#xff1a;服務器通常需要高性能的硬件和穩定的網絡環境&#xff0…

Mac如何連接惠普M126a打印機(教程篇)

這里寫自定義目錄標題Mac如何連接惠普M126a打印機&#xff08;教程篇&#xff09;教程配置如下&#xff1a;Mac如何連接惠普M126a打印機&#xff08;教程篇&#xff09; 惠普M126a連接Mac&#xff08;教程篇&#xff09; 教程配置如下&#xff1a; 首先&#xff0c;先獲取與HP打…

感恩日記:記錄生活中的美好時刻

感恩日記的landing page登錄注冊填寫感恩事項私信可以體驗一下

一扇門鈴,萬向感應——用 eventfd 實現零延遲通信

&#x1f50d; 本篇概要 eventfd 是 Linux 提供的一種輕量級事件通知機制。你可以把它想象成一個“計數器盒子”。它里面維護的是一個64位的計數器。寫入&#xff1a;往盒子里放一些數字&#xff08;比如 1、5、10&#xff09;&#xff0c;表示有幾件事發生了。讀取&#xff1a…

基于Node.js的線上教學系統的設計與實現(源碼+論文+調試+安裝+售后)

感興趣的可以先收藏起來&#xff0c;還有大家在畢設選題&#xff0c;項目以及論文編寫等相關問題都可以給我留言咨詢&#xff0c;我會一一回復&#xff0c;希望幫助更多的人。系統背景近年來&#xff0c;全球數字化浪潮的推進與教育公平化需求的增長&#xff0c;促使線上教學迎…

互斥鎖詳解(操作系統os)

1. 互斥鎖 (Mutex) - 檔案室的“智能鎖”首先&#xff0c;我們給之前討論的那些“鎖”一個正式的名字&#xff1a;互斥鎖 (Mutex)。概念&#xff1a;你可以把它簡單理解成檔案室門上的一把“智能鎖”。它只有兩種狀態&#xff1a;locked (已上鎖) 或 unlocked (未上鎖)。操作&a…

自動潤滑系統:從 “盲目養護“ 到智能精注的工業運維革命

?在工業運維的漫長歷史中&#xff0c;傳統潤滑模式如同"定時喂飯"——無論設備實際需求&#xff0c;僅憑經驗或固定周期執行潤滑作業。這種模式埋下兩大隱患&#xff1a;過度潤滑&#xff1a;某汽車生產線曾因季度性強制潤滑&#xff0c;每年浪費1.2噸潤滑脂&#x…

【Java八股文總結 — 包學會】(二)計算機網絡

1.一條url輸入到瀏覽器最后顯示頁面的過程 URL解析與處理 瀏覽器解析URL&#xff08;如https://www.example.com/page&#xff09; 分離協議&#xff08;https&#xff09;、域名&#xff08;www.example.com&#xff09;和資源路徑&#xff08;/page&#xff09; 檢查HSTS預加…

力扣61.旋轉鏈表

給你一個鏈表的頭節點 head &#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置。示例 1&#xff1a;輸入&#xff1a;head [1,2,3,4,5], k 2 輸出&#xff1a;[4,5,1,2,3]示例 2&#xff1a;輸入&#xff1a;head [0,1,2], k 4 輸出&#xff1a;[2,0,1]提示…

深度剖析:std::vector 內存機制與 push_back 擴容策略

深度剖析&#xff1a;std::vector 內存機制與 push_back 擴容策略 1. std::vector 核心內部結構 #mermaid-svg-8HOj3MqsD6UVgEeA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8HOj3MqsD6UVgEeA .error-icon{fill:…

GROW領導力模型

GROW領導力模型是由英國教練格雷厄姆亞歷山大&#xff08;Graham Alexander&#xff09;、艾倫Fine和約翰惠特默&#xff08;John Whitmore&#xff09;在20世紀80年代提出的&#xff0c;最初用于體育教練領域&#xff0c;后來被廣泛應用于企業管理、領導力發展和個人成長中。它…

打破并發瓶頸:虛擬線程實現詳解與傳統線程模型的性能對比

目錄 一、定義與特性 二、虛擬線程實現 2.1 使用 Thread.startVirtualThread() 創建 2.2 使用 Thread.ofVirtual() 創建 2.3 使用 ThreadFactory 創建 2.4 使用 Executors.newVirtualThreadPerTaskExecutor()創建 三、虛擬線程和普通線程的區別 3.1 線程管理方式不同 3…

“28項評測23項SOTA——GLM-4.1V-9B-Thinking本地部署教程:10B級視覺語言模型的性能天花板!

一、模型介紹 GLM-4.1V-9B-Thinking是由智譜AI聯合清華大學團隊推出的多模態大模型&#xff0c;以GLM-4-9B-0414基座模型為底&#xff0c;通過引入“思維鏈推理機制”和“課程采樣強化學習策略”&#xff08;Reinforcement Learning with Curriculum Sampling&#xff09;&…

推薦系統-Random算法

Random算法總結引言 在推薦系統研究與應用中&#xff0c;我們常常需要一些簡單的基線算法來衡量更復雜算法的性能提升。Random&#xff08;隨機推薦&#xff09;算法是最基礎的基線方法之一&#xff0c;它通過隨機生成評分來模擬用戶對物品的偏好。雖然這種方法看似簡單&#x…

Django--02模型和管理站點

Django–02模型與站點管理 Part 2: Models and the admin site 本教程承接Django–01的內容。我們將設置數據庫、創建你的第一個模型&#xff0c;并快速了解 Django 自動生成的管理站點。 文章目錄Django--02模型與站點管理前言一、設置數據庫1.1 參考文檔鏈接1.2 默認設置1.3…