一文教你如何利用 Python 進行數據清洗
數據清洗是數據分析中非常重要的一步,它可以幫助我們處理不完整、不準確或不一致的數據。今天,我們就來聊聊如何用 Python 進行數據清洗。Python 有強大的庫如 Pandas 和 NumPy,它們提供了豐富的工具來幫助我們高效地完成數據清洗任務。
導入必要的庫
首先,我們需要導入一些常用的庫,比如 Pandas 和 NumPy。Pandas 是一個強大的數據處理庫,NumPy 則主要用于數值計算。
import pandas as pd
import numpy as np
讀取數據
假設我們有一個 CSV 文件 data.csv,我們可以使用 Pandas 的 read_csv 函數來讀取數據。
# 讀取 CSV 文件
df = pd.read_csv('data.csv')
# 查看前 5 行數據
print(df.head())
檢查數據基本信息
在開始清洗數據之前,我們需要了解數據的基本信息,包括數據的形狀、列名、數據類型等。
# 查看數據形狀
print(f"數據形狀: {df.shape}")
# 查看列名
print(f"列名: {df.columns.tolist()}")
# 查看數據類型
print(f"數據類型: \n{df.dtypes}")
處理缺失值
缺失值是數據清洗中常見的問題。我們可以使用 isnull() 和 notnull() 函數來檢查缺失值,并使用 fillna() 或 dropna() 來處理它們。
# 檢查缺失值
print(df.isnull().sum())
# 填充缺失值
df['age'].fillna(df['age'].mean(), inplace=True) # 用平均值填充年齡列的缺失值
df['income'].fillna(0, inplace=True) # 用 0 填充收入列的缺失值
# 刪除含有缺失值的行
df.dropna(subset=['address'], inplace=True) # 刪除地址列中含有缺失值的行
處理重復值
重復值可能會導致分析結果失真。我們可以使用 duplicated() 和 drop_duplicates() 函數來檢測和刪除重復值。
# 檢查重復值
print(df.duplicated().sum())
# 刪除重復值
df.drop_duplicates(inplace=True)
數據類型轉換
有時候,數據的類型可能不符合我們的需求。我們可以使用 astype() 函數來轉換數據類型。
# 將 age 列轉換為整數類型
df['age'] = df['age'].astype(int)
# 將 income 列轉換為浮點數類型
df['income'] = df['income'].astype(float)
處理異常值
異常值可能會對分析結果產生重大影響。我們可以使用統計方法(如 Z-score)或箱線圖來檢測和處理異常值。
# 使用 Z-score 方法檢測異常值
from scipy import stats
z_scores = np.abs(stats.zscore(df['income']))
df = df[z_scores < 3] # 保留 Z-score 小于 3 的數據
# 使用箱線圖方法檢測異常值
Q1 = df['income'].quantile(0.25)
Q3 = df['income'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df = df[(df['income'] >= lower_bound) & (df['income'] <= upper_bound)]
標準化和歸一化
在某些情況下,我們可能需要對數據進行標準化或歸一化處理,以便更好地進行模型訓練。
# 標準化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[['age', 'income']] = scaler.fit_transform(df[['age', 'income']])
# 歸一化
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[['age', 'income']] = scaler.fit_transform(df[['age', 'income']])
保存清洗后的數據
最后,我們將清洗后的數據保存到一個新的 CSV 文件中,以便后續使用。
# 保存清洗后的數據
df.to_csv('cleaned_data.csv', index=False)
實戰案例:處理電商用戶數據
假設我們有一個電商用戶的 CSV 文件 users.csv,包含用戶的年齡、收入、地址等信息。我們需要對其進行數據清洗,以確保數據的質量。
步驟 1:讀取數據
# 讀取 CSV 文件
df = pd.read_csv('users.csv')
# 查看前 5 行數據
print(df.head())
步驟 2:檢查數據基本信息
# 查看數據形狀
print(f"數據形狀: {df.shape}")
# 查看列名
print(f"列名: {df.columns.tolist()}")
# 查看數據類型
print(f"數據類型: \n{df.dtypes}")
步驟 3:處理缺失值
# 檢查缺失值
print(df.isnull().sum())
# 填充缺失值
df['age'].fillna(df['age'].mean(), inplace=True) # 用平均值填充年齡列的缺失值
df['income'].fillna(0, inplace=True) # 用 0 填充收入列的缺失值
# 刪除含有缺失值的行
df.dropna(subset=['address'], inplace=True) # 刪除地址列中含有缺失值的行
步驟 4:處理重復值
# 檢查重復值
print(df.duplicated().sum())
# 刪除重復值
df.drop_duplicates(inplace=True)
步驟 5:數據類型轉換
# 將 age 列轉換為整數類型
df['age'] = df['age'].astype(int)
# 將 income 列轉換為浮點數類型
df['income'] = df['income'].astype(float)
步驟 6:處理異常值
# 使用 Z-score 方法檢測異常值
z_scores = np.abs(stats.zscore(df['income']))
df = df[z_scores < 3] # 保留 Z-score 小于 3 的數據
# 使用箱線圖方法檢測異常值
Q1 = df['income'].quantile(0.25)
Q3 = df['income'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df = df[(df['income'] >= lower_bound) & (df['income'] <= upper_bound)]
步驟 7:保存清洗后的數據
# 保存清洗后的數據
df.to_csv('cleaned_users.csv', index=False)
總結
本文介紹了如何使用 Python 進行數據清洗,包括導入必要的庫、讀取數據、檢查數據基本信息、處理缺失值、處理重復值、數據類型轉換、處理異常值、標準化和歸一化,以及保存清洗后的數據。通過一個實戰案例,我們詳細展示了如何處理電商用戶數據。