当前位置: 首页 > news >正文

数据清洗案例

数据清洗步骤

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')
http://www.xdnf.cn/news/421975.html

相关文章:

  • 开源自定义Python库并上传到PyPi
  • 基于几何布朗运动的股价预测模型构建与分析
  • 华为0507机试
  • 【力扣】K个一组翻转链表
  • aardio - godking.vlistEx.listbar + win.ui.tabs 实现多标签多页面切换
  • llamafactory-记录一次消除模型随机性的成功过程
  • VSCode中Node.js 使用教程
  • WPF自定义控件开发全指南:多内容切换与动画集成
  • 基于深度学习的水果识别系统设计
  • 蛋白设计 ProteinMPNN
  • go语言学习进阶
  • Telnet 类图解析
  • 题海拾贝:P1833 樱花
  • 不用服务器转码,Web端如何播放RTSP视频流?
  • 多线程代码案例-1 单例模式
  • 在spark中配置历史服务器
  • 【C++】深入理解 unordered 容器、布隆过滤器与分布式一致性哈希
  • 拓扑排序详解
  • H5S 视频监控AWS S3 对象存储
  • BGP实验练习2
  • Github 2025-05-13 Python开源项目日报 Top10
  • 从零开始:使用 Vue-ECharts 实现数据可视化图表功能
  • 详解Windows(十一)——网络连接设置
  • 解锁ozon运营新路径:自养号测评技术如何实现降本增效
  • CSS结构性伪类、UI伪类与动态伪类全解析:从文档结构到交互状态的精准选择
  • 【Flask全栈开发指南】从零构建企业级Web应用
  • Vue3+uniapp 封装axios
  • 《猜拳游戏》
  • 深入学习Zookeeper的知识体系
  • 软件测试服务公司分享:国产化适配测试的重要性和关键要素