Pandas-數據查看與質量檢查
- 一、數據查看:快速掌握數據概況
- 1. 整體概覽:shape與info()
- 2. 數值特征預覽:describe()
- 3. 隨機抽樣:head()與sample()
- 二、數據質量檢查:識別與處理問題
- 1. 缺失值檢查與處理
- 處理策略:
- 2. 異常值檢測與處理
- 處理策略:
- 3. 重復數據檢查與處理
- 4. 數據類型錯誤處理
- 三、高級檢查:一致性與邏輯性驗證
- 四、實戰案例:完整數據質量檢查流程
數據分析流程中,拿到數據后的第一步不是急于建模或可視化,而是全面了解數據——包括數據規模、結構、取值分布以及潛在的質量問題。Pandas作為數據處理的利器,提供了一系列簡潔高效的工具,幫助我們快速完成數據查看與質量檢查。
一、數據查看:快速掌握數據概況
數據查看的核心目標是回答“數據是什么樣的”,包括樣本量、特征數、數據類型、取值范圍等基礎信息。Pandas的幾個核心函數可以幫我們快速建立對數據的認知。
1. 整體概覽:shape與info()
import pandas as pd
import numpy as np# 讀取示例數據(假設為某電商用戶行為數據)
df = pd.read_csv('user_behavior.csv')# 查看數據規模(行數×列數)
print(f"數據形狀:{df.shape}") # 輸出:數據形狀:(10000, 8)# 查看詳細信息(數據類型、非空值數量)
df.info()
info()
的輸出包含關鍵信息:
- 每列的名稱、數據類型(
dtype
) - 非空值數量(可快速判斷是否存在缺失值)
- 內存占用(幫助評估數據規模)
例如,若某列dtype
顯示為object
但實際應為日期,或某列非空值遠少于總行數,這些都是需要進一步處理的信號。
2. 數值特征預覽:describe()
對于數值型列(int
/float
),describe()
函數提供了基本統計量,幫助快速判斷數據分布:
# 查看數值列的統計摘要
df.describe()
輸出包含:
- 計數(
count
)、均值(mean
)、標準差(std
) - 最小值(
min
)、四分位數(25%
/50%
/75%
)、最大值(max
)
通過這些指標可初步識別異常值(如最大值遠大于75%分位數)或分布偏態(如均值遠大于中位數)。
3. 隨機抽樣:head()與sample()
查看前幾行或隨機樣本,直觀感受數據內容:
# 查看前5行(默認)
df.head()# 查看后10行
df.tail(10)# 隨機抽取5行(避免數據排序導致的偏差)
df.sample(5)
這一步能發現明顯的數據錯誤,例如:
- 日期列格式混亂(如同時存在
2023/1/1
和01-01-2023
) - 分類列存在拼寫錯誤(如
"男"
和"男性"
同時出現)
二、數據質量檢查:識別與處理問題
數據質量直接決定分析結果的可靠性,常見問題包括缺失值、異常值、重復數據和數據類型錯誤,Pandas提供了針對性的檢測與處理工具。
1. 缺失值檢查與處理
缺失值是最常見的數據質量問題,需先明確缺失比例和模式:
# 計算每列缺失值數量及比例
missing_count = df.isnull().sum()
missing_ratio = (missing_count / len(df)).round(3)
missing_df = pd.DataFrame({'缺失值數量': missing_count,'缺失比例': missing_ratio
})
print(missing_df[missing_df['缺失值數量'] > 0]) # 只顯示有缺失的列
處理策略:
-
刪除:缺失比例極高(如>80%)或對分析無影響的列:
df = df.drop(columns=['irrelevant_col']) # 刪除整列
缺失行較少時可刪除行:
df = df.dropna(subset=['critical_col']) # 只刪除關鍵列缺失的行
-
填充:根據列類型選擇填充方式:
# 數值列:用均值/中位數填充(中位數更抗異常值) df['amount'] = df['amount'].fillna(df['amount'].median())# 分類列:用眾數或特殊值(如"未知")填充 df['category'] = df['category'].fillna(df['category'].mode()[0])# 日期列:用前后值插值 df['date'] = df['date'].fillna(method='ffill') # 向前填充(用上一行值)
2. 異常值檢測與處理
異常值(離群點)可能扭曲統計結果,需結合業務邏輯判斷:
# 方法1:基于標準差(適用于近似正態分布的數據)
def detect_outliers_std(col, n_std=3):mean = col.mean()std = col.std()lower = mean - n_std * stdupper = mean + n_std * stdreturn (col < lower) | (col > upper)# 檢測數值列的異常值
numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns
for col in numeric_cols:outliers = detect_outliers_std(df[col])print(f"{col}異常值比例:{outliers.mean():.2%}")# 方法2:基于四分位數(IQR法,適用于偏態分布)
Q1 = df['amount'].quantile(0.25)
Q3 = df['amount'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers_iqr = (df['amount'] < lower_bound) | (df['amount'] > upper_bound)
處理策略:
- 截斷:將異常值限制在合理范圍(如用上下邊界替換)
df['amount'] = df['amount'].clip(lower_bound, upper_bound)
- 標記:不刪除異常值,而是新增列標記供后續分析
df['is_outlier'] = outliers_iqr
3. 重復數據檢查與處理
重復數據可能導致分析結果被高估,需檢測并去重:
# 檢查重復行數量
duplicate_count = df.duplicated().sum()
print(f"重復行數量:{duplicate_count}")# 查看重復樣本
if duplicate_count > 0:print(df[df.duplicated(keep=False)].sort_values(by=df.columns.tolist()))# 刪除重復行(保留第一行)
df = df.drop_duplicates(keep='first')
注意:重復行可能是真實數據(如用戶重復購買),需結合業務邏輯判斷是否去重。
4. 數據類型錯誤處理
數據類型錯誤會導致分析函數失效(如對字符串列計算均值),需針對性轉換:
# 1. 字符串轉日期(關鍵操作,否則無法按時間分組)
df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')
# errors='coerce'將無效格式轉為NaT(缺失日期)# 2. 數值型字符串轉數值(如"100"→100)
df['price'] = pd.to_numeric(df['price'], errors='coerce')# 3. 分類列優化(減少內存占用,便于后續分析)
df['gender'] = df['gender'].astype('category')
三、高級檢查:一致性與邏輯性驗證
除了基礎問題,還需驗證數據的業務邏輯性,例如:
- 訂單金額不能為負
- 開始日期不能晚于結束日期
# 檢查金額合理性
invalid_amount = df[df['amount'] < 0]
if not invalid_amount.empty:print(f"發現{len(invalid_amount)}條金額為負的記錄")df['amount'] = df['amount'].clip(lower=0) # 修正為0# 檢查日期邏輯
df['start_date'] = pd.to_datetime(df['start_date'])
df['end_date'] = pd.to_datetime(df['end_date'])
invalid_dates = df[df['start_date'] > df['end_date']]
if not invalid_dates.empty:print(f"發現{len(invalid_dates)}條開始日期晚于結束日期的記錄")# 交換錯誤的日期mask = df['start_date'] > df['end_date']df.loc[mask, ['start_date', 'end_date']] = df.loc[mask, ['end_date', 'start_date']].values
四、實戰案例:完整數據質量檢查流程
def data_quality_check(df):"""數據質量檢查與清洗函數"""print("=== 數據概覽 ===")print(f"形狀:{df.shape}")df.info()print("\n=== 缺失值檢查 ===")missing = df.isnull().sum()missing = missing[missing > 0]if not missing.empty:print(missing)# 處理策略:數值列填充中位數,分類列填充眾數for col in missing.index:if pd.api.types.is_numeric_dtype(df[col]):df[col] = df[col].fillna(df[col].median())else:df[col] = df[col].fillna(df[col].mode()[0])print("缺失值已處理")else:print("無缺失值")print("\n=== 重復數據檢查 ===")duplicates = df.duplicated().sum()if duplicates > 0:df = df.drop_duplicates()print(f"刪除{duplicates}條重復行,剩余{len(df)}行")else:print("無重復數據")print("\n=== 異常值檢查 ===")numeric_cols = df.select_dtypes(include=['number']).columnsfor col in numeric_cols:Q1 = df[col].quantile(0.25)Q3 = df[col].quantile(0.75)IQR = Q3 - Q1outliers = (df[col] < (Q1 - 1.5 * IQR)) | (df[col] > (Q3 + 1.5 * IQR))if outliers.sum() > 0:print(f"{col}存在{outliers.sum()}個異常值,已截斷至合理范圍")df[col] = df[col].clip(Q1 - 1.5 * IQR, Q3 + 1.5 * IQR)print("\n=== 數據類型修正 ===")# 自動檢測并轉換日期列for col in df.columns:if 'date' in col.lower():df[col] = pd.to_datetime(df[col], errors='coerce')print("數據類型已修正")return df# 執行檢查與清洗
clean_df = data_quality_check(df)
總結:數據質量檢查的核心原則
- 全面掃描:結合統計指標與樣本查看,不遺漏任何列。
- 區別對待:根據列的類型(數值/分類/日期)選擇合適的檢查方法。
- 業務導向:異常值和缺失值的處理需符合業務邏輯,而非機械套用公式。
- 可復現性:將檢查與清洗步驟封裝為函數,確保流程可重復、可追溯。
That’s all, thanks for reading~~
覺得有用就點個贊
、收進收藏
夾吧!關注
我,獲取更多干貨~