数据清洗案例
数据清洗步骤
1. 加载数据并查看基本信息
python
运行
import pandas as pd
import numpy as np
from datetime import datetime# 加载数据
data = pd.read_csv('user_purchase.csv')# 查看数据基本信息
print('数据基本信息:')
data.info()# 查看数据集行数和列数
rows, columns = data.shapeif rows != 0:# 查看数据集行数是否大于0print('数据全部内容信息:')print(data.to_csv(sep='\t', na_rep='nan'))
else:print('数据全部内容信息:')print('数据全部内容为空')
2. 处理缺失值
python
运行
# 检查缺失值
missing_values = data.isnull().sum()
print('\n缺失值统计:')
print(missing_values)# 处理缺失值:删除缺失值超过50%的列
threshold = 0.5 * len(data)
data = data.dropna(axis=1, thresh=threshold)# 年龄使用中位数填充
if 'age' in data.columns:median_age = data['age'].median()data['age'].fillna(median_age, inplace=True)# 购买金额使用均值填充
if 'amount' in data.columns:mean_amount = data['amount'].mean()data['amount'].fillna(mean_amount, inplace=True)
3. 处理异常值
python
运行
# 检查异常值
if 'amount' in data.columns:# 购买金额不能为负数,将负值设为0data.loc[data['amount'] < 0, 'amount'] = 0# 基于3σ原则检测异常值并修正mean = data['amount'].mean()std = data['amount'].std()upper_bound = mean + 3 * stdlower_bound = mean - 3 * std# 将超出3σ范围的值修正为上下限data.loc[data['amount'] > upper_bound, 'amount'] = upper_bounddata.loc[data['amount'] < lower_bound, 'amount'] = lower_bound
4. 处理重复值
python
运行
# 检查重复值
duplicate_rows = data.duplicated().sum()
print(f'\n重复记录数:{duplicate_rows}')# 删除重复值
data = data.drop_duplicates()
5. 格式转换与标准化
python
运行
# 日期格式统一化
def standardize_date(date_str):try:# 尝试解析不同格式的日期if isinstance(date_str, str):# 处理 "YYYY-MM-DD" 格式if '-' in date_str:return datetime.strptime(date_str, '%Y-%m-%d').strftime('%Y-%m-%d')# 处理 "DD/MM/YYYY" 格式elif '/' in date_str:return datetime.strptime(date_str, '%d/%m/%Y').strftime('%Y-%m-%d')# 无法解析的日期设为缺失值return np.nanexcept:return np.nan# 应用日期标准化函数
if 'purchase_date' in data.columns:data['purchase_date'] = data['purchase_date'].apply(standardize_date)# 删除仍无法解析的日期行data = data.dropna(subset=['purchase_date'])
6. 保存清洗后的数据
python
运行
# 保存清洗后的数据
data.to_csv('cleaned_user_purchase.csv', index=False)
print('\n数据清洗完成,已保存为 cleaned_user_purchase.csv')
完整代码
将上述步骤整合为完整的 Python 脚本:
python
运行
import pandas as pd
import numpy as np
from datetime import datetime# 1. 加载数据并查看基本信息
try:# 尝试加载数据data = pd.read_csv('user_purchase.csv')
except FileNotFoundError:print("错误:找不到 'user_purchase.csv' 文件,请确保文件路径正确。")exit(1)print('数据基本信息:')
data.info()# 查看数据集行数和列数
rows, columns = data.shapeif rows != 0:# 查看数据集行数是否大于0print('数据全部内容信息:')print(data.to_csv(sep='\t', na_rep='nan'))
else:print('数据全部内容信息:')print('数据全部内容为空')# 2. 处理缺失值
print('\n缺失值统计:')
missing_values = data.isnull().sum()
print(missing_values)# 处理缺失值:删除缺失值超过50%的列
threshold = 0.5 * len(data)
data = data.dropna(axis=1, thresh=threshold)# 年龄使用中位数填充
if 'age' in data.columns:median_age = data['age'].median()data['age'].fillna(median_age, inplace=True)# 购买金额使用均值填充
if 'amount' in data.columns:mean_amount = data['amount'].mean()data['amount'].fillna(mean_amount, inplace=True)# 3. 处理异常值
if 'amount' in data.columns:# 购买金额不能为负数,将负值设为0data.loc[data['amount'] < 0, 'amount'] = 0# 基于3σ原则检测异常值并修正mean = data['amount'].mean()std = data['amount'].std()upper_bound = mean + 3 * stdlower_bound = mean - 3 * std# 将超出3σ范围的值修正为上下限data.loc[data['amount'] > upper_bound, 'amount'] = upper_bounddata.loc[data['amount'] < lower_bound, 'amount'] = lower_bound# 4. 处理重复值
duplicate_rows = data.duplicated().sum()
print(f'\n重复记录数:{duplicate_rows}')# 删除重复值
data = data.drop_duplicates()# 5. 格式转换与标准化
if 'purchase_date' in data.columns:def standardize_date(date_str):try:if isinstance(date_str, str):if '-' in date_str:return datetime.strptime(date_str, '%Y-%m-%d').strftime('%Y-%m-%d')elif '/' in date_str:return datetime.strptime(date_str, '%d/%m/%Y').strftime('%Y-%m-%d')return np.nanexcept:return np.nandata['purchase_date'] = data['purchase_date'].apply(standardize_date)# 删除仍无法解析的日期行data = data.dropna(subset=['purchase_date'])# 6. 保存清洗后的数据
data.to_csv('cleaned_user_purchase.csv', index=False)
print('\n数据清洗完成,已保存为 cleaned_user_purchase.csv')