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