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

别光看教程了!用Pandas处理你的第一个真实数据集(从CSV导入到清洗完整流程)

别光看教程了!用Pandas处理你的第一个真实数据集(从CSV导入到清洗完整流程)

当你第一次打开Jupyter Notebook,输入import pandas as pd时,可能已经看过无数Pandas教程。但面对实际业务中那份格式混乱的CSV文件,依然会手足无措——为什么数据总读不完整?为什么合并表格时出现诡异错误?这就是真实世界的数据分析:没有完美样本,只有各种"脏数据"的实战考验。本文将带你用Pandas处理一份模拟电商订单数据(包含典型问题:缺失值、异常日期、重复记录),最终输出可分析的数据集。

1. 实战环境准备与数据概览

工欲善其事,必先利其器。推荐使用Jupyter Lab作为交互环境(比传统Notebook更强大的模块化界面),配合以下工具链:

# 创建虚拟环境(避免包冲突) python -m venv pandas_venv source pandas_venv/bin/activate # Linux/Mac pandas_venv\Scripts\activate # Windows # 安装核心库 pip install pandas numpy matplotlib jupyterlab

我们的示例数据集dirty_orders.csv模拟了真实业务场景,包含以下典型问题:

  • 第3行金额列存在$1,200.50这样的货币符号
  • 第7、15行的客户ID为NaN
  • 第10-12行的日期格式混用2023/01/1515-Jan-2023
  • 第20行重复记录了相同的订单

提示:实际工作中应先使用head()info()快速扫描数据,而非直接开始清洗。这能避免因盲目操作导致的二次污染。

2. 数据导入的陷阱与解决方案

直接使用pd.read_csv()可能会遇到以下常见问题:

问题类型错误表现解决方案
编码错误UnicodeDecodeError指定encoding='utf-8''gbk'
自动类型推断失败数字被识别为字符串设置dtype={'amount': float}
分隔符识别错误所有数据挤在一列明确sep=','或自定义分隔符
注释行干扰首行被误认为列名使用comment='#'跳过注释行

针对我们的数据集,使用增强版导入方式:

import numpy as np df = pd.read_csv( 'dirty_orders.csv', parse_dates=['order_date'], # 自动解析日期列 thousands=',', # 处理千分位符 na_values=['NA', 'N/A'], # 扩展缺失值标识 converters={ 'amount': lambda x: float(x.replace('$', '')) # 自定义金额清洗 } ) print(f"原始数据形状: {df.shape}")

3. 数据清洗的五个关键步骤

3.1 处理缺失值的智能策略

缺失值处理不是简单删除,需分场景决策:

  1. 诊断缺失模式

    # 可视化缺失分布 import seaborn as sns sns.heatmap(df.isnull(), cbar=False)
  2. 针对性处理

    • 客户ID缺失:标记为"匿名客户"(业务需求)
    • 数值列缺失:用同品类中位数填充
    df['customer_id'].fillna('匿名客户', inplace=True) df['amount'] = df.groupby('product_category')['amount'].transform( lambda x: x.fillna(x.median()))

3.2 日期格式的统一化处理

混用日期格式会导致时间序列分析失效:

# 方法1:强制统一格式(适合明确知道正确格式) df['order_date'] = pd.to_datetime(df['order_date'], format='%Y/%m/%d') # 方法2:智能解析(适合不确定格式的情况) df['order_date'] = pd.to_datetime( df['order_date'], infer_datetime_format=True, errors='coerce' # 转换失败设为NaT ) # 移除无效日期行 df = df[df['order_date'].notna()]

3.3 异常值的检测与处理

使用描述性统计和业务规则双重验证:

stats = df['amount'].describe() iqr = stats['75%'] - stats['25%'] upper_bound = stats['75%'] + 1.5 * iqr # 业务规则:单笔订单不超过10000元 df = df[(df['amount'] <= upper_bound) & (df['amount'] <= 10000)]

4. 数据转换与增强

清洗后的数据需要结构化处理才能发挥价值:

4.1 创建衍生特征

# 从日期提取周数/季度 df['order_week'] = df['order_date'].dt.isocalendar().week df['order_quarter'] = df['order_date'].dt.quarter # 金额分段(用于分析客户消费层级) bins = [0, 100, 500, 1000, np.inf] labels = ['<100', '100-500', '500-1000', '>1000'] df['amount_tier'] = pd.cut(df['amount'], bins=bins, labels=labels)

4.2 数据透视与聚合

生成各品类周销售报表:

weekly_sales = pd.pivot_table( df, values='amount', index='product_category', columns='order_week', aggfunc=['sum', 'count'], margins=True )

5. 成果输出与自动化脚本

最终输出清洗后的数据和分析报表:

# 保存清洗结果 df.to_csv('cleaned_orders.csv', index=False) # 生成带格式的Excel报告 with pd.ExcelWriter('sales_report.xlsx') as writer: df.to_excel(writer, sheet_name='Cleaned Data') weekly_sales.to_excel(writer, sheet_name='Weekly Summary') # 添加Excel图表 workbook = writer.book worksheet = writer.sheets['Weekly Summary'] chart = workbook.add_chart({'type': 'column'}) chart.add_series({ 'values': '=Weekly Summary!$B$2:$E$2', 'categories': '=Weekly Summary!$B$1:$E$1' }) worksheet.insert_chart('G2', chart)

注意:实际项目中建议将清洗流程封装为函数,并使用pd.pipe()实现链式调用。例如:

def clean_data(df): return ( df.pipe(handle_missing) .pipe(format_dates) .pipe(remove_outliers) )
http://www.jsqmd.com/news/965996/

相关文章:

  • 番禺石壁黄金回收|金小福本地实体南站30分钟上门大盘报价秒结 - 花生花生1
  • CSDN后台审核日志逆向分析:联系方式被删前必现的2个隐藏信号,第2个99%人忽略
  • AI 赋能下中间人攻击机理与分层防御技术研究
  • VC6环境下可直接编译的MFC多线程网页抓取工具(带图形界面与HTTP下载控制)
  • Llama 3.1 8B微调实战:低成本实现可靠Function Calling
  • 【分享】分享两仪虚拟机 支持root多种玩机玩法 不卡99永久免费
  • C++嵌入Python解释器实战:零拷贝、异常互通与一键安装
  • 基于 Harmony 6.0 应用的中医体质测评应用首页实现
  • Dockerfile里COPY和ADD到底怎么选?一个真实镜像构建失败的排查实录
  • YOLO26涨点改进| TGRS 2026 顶刊| 注意力改进篇| 引入MSEA多尺度边缘感知注意力,助力红外小目标检测、遥感目标检测、工业缺陷检测、图像去雨雾任务高效涨点
  • 终极指南:如何用NVIDIA Profile Inspector免费解锁显卡隐藏性能
  • 别再混淆了!用Python和NumPy手把手教你算高斯波形的FWHM、拐点和标准差σ
  • ICPC/CCPC选手必备:2018-2022年所有赛题链接整理与刷题平台指南
  • 用Python和Librosa库,5分钟搞定音频频率分析(附完整代码和音高对照表)
  • 别再手动调样式了!用POI 4.1.2在Word里动态生成图表,这份避坑指南请收好
  • CVPR2021 Coordinate Attention 源码逐行解析:从论文公式到PyTorch代码的‘翻译’过程
  • AI领导者必懂的28个优化核心词:决策校准而非术语背诵
  • 从“Hello World”到漏洞利用:用Java写一个自己的简易版ysoserial(理解Gadget链)
  • Delphi轻量级网卡实时流量监控工具,支持上传下载吞吐量精确统计
  • Python 并发性能调优:深入 CPython 解释器 GIL 锁(Global Interpreter Lock)物理限制与多进程、多线程、协程异步 I/O 混合高并发底座实战
  • 2026产品宣传动画服务商评测:香港安全警示动画、上海事故还原动画、上海工业3D动画、事故还原动画、北京3D动画选择指南 - 优质品牌商家
  • Switch游戏文件管理难题?5个核心功能让NSC_BUILDER成为你的瑞士军刀
  • 保姆级教程:用Docker 2.0.0镜像5分钟搞定RocketMQ Dashboard部署与监控
  • 2026年智能体开发平台服务实力排行:Agent平台、agent开发、无代码、智能体搭建、智能问数、私有化AI低代码选择指南 - 优质品牌商家
  • 生成式 AI 驱动钓鱼攻防成本异化与智能代理防御体系研究
  • 终极小说下载指南:100+网站一键永久保存,打造你的私人数字图书馆
  • 2026医疗健康数据治理技术解析与优质服务商参考:企业数据治理方案/企业数智融合方案/全链路数据治理库/医疗健康数据治理/选择指南 - 优质品牌商家
  • 大模型评估指标全解析:困惑度、BLEU、ROUGE、BERTScore怎么用?
  • 零代码AI工具实战指南:6款真正免编程的智能应用方案
  • Flowable实战:如何精准获取当前任务的下一个节点(含会签与网关处理)