1. 项目背景与整体思路:先搞清楚要做什么
做数据分析这行久了会发现,真正拉开效率差距的不是谁的模型更花哨,而是拿到一份脏乱差的原始数据后,谁能更快把它收拾成能分析的样子。这次我处理的项目就是一个典型的Pandas工作流:从一份Excel销售明细表出发,完成数据清洗、维度聚合、可视化输出,整个链路走通之后,我对Pandas的定位有了更清晰的体会——它不是一个"高级Excel",而是一套可以随时复跑的数据加工流水线。
这个项目解决的是很现实的问题:业务部门给过来的表格里,有重复的订单、有格式错乱的日期、有空缺的金额、有混在一起的字段,直接用Excel手动处理不仅慢,而且这周做完下周再来一份还得重来。用Pandas写一遍清洗逻辑,以后数据一进来,跑一遍脚本就能拿到干净表,再顺手出几张图。适合谁看?刚接触Python数据分析的人、被各种清洗需求折磨的运营同学、准备面试想系统梳理Pandas用法的朋友,都能从这套流程里找到可以直接抄走的代码。
我用的源数据是一份模拟的电商销售明细,大概有六万行,字段包括:订单编号、客户ID、所属品类、商品单价、成交金额、订单日期、订单状态、备注。说实话,这份数据的脏程度是刻意放大过的,现实中我碰到过比这更离谱的,比如同一个订单编号出现三次但金额每次都不一样,日期列里混着"2024/3/1"和"20240301"两种格式,金额字段里带着人民币符号和千分位逗号。把这些问题逐一处理干净,正是Pandas最擅长的事。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与数据导入:第一天踩的坑都在这里
2.1 Pandas安装与版本选择
很多人问Pandas怎么装,其实就一条命令的事。我习惯先建一个独立的虚拟环境,避免把系统Python搞乱。创建环境用的是conda或venv都可以,我的项目是在Python 3.10的虚拟环境里跑的。
bash复制pip install pandas openpyxl
这里有个细节值得注意:openpyxl这个库请务必一起装上。只看Pandas官方文档容易漏掉这个,但Pandas读取xlsx文件默认依赖openpyxl引擎,不装的话会直接报ImportError。如果你手里的是老版xls文件,还需要xlrd,不过我强烈建议能转xlsx就转xlsx,新项目就别在老格式上纠结了。
关于版本适配,实测下来Python 3.10配Pandas 2.x完全没问题,如果你用的是Python 3.11或3.12,也别担心,Pandas 2.1之后对高版本Python的支持已经很成熟。装完之后在Python里输入以下两行确认环境没问题:
python复制import pandas as pd
print(pd.__version__)
print(pd.__version__ >= '2.0')
如果pip下载速度很慢,可以用国内镜像源加速,这个属于常规操作,网上随便一搜就有,我就不展开了。
2.2 读取Excel文件的两个关键参数
读取Excel看似一句话,但实际读进来之后,表头、列类型、日期解析经常出问题。我的做法是第一次读取时就尽量把参数设置到位,减少重复劳动。
python复制df = pd.read_excel(
'sales_2024.xlsx',
sheet_name='订单明细',
engine='openpyxl',
header=0,
dtype={'客户ID': str, '订单编号': str},
parse_dates=['订单日期']
)
这里单独说下dtype参数。客户ID和订单编号这类字段,本质上是字符串,不是数字。如果不指定类型,Pandas会自动识别成int64,这就埋了一个雷——有些客户ID是0开头的,读成int之后开头的0就丢了;订单编号如果有字母混进去,列类型会变成object,其实也能用,但后续排序和匹配时容易踩坑。所以我在读取阶段就强制指定为str,一开始就把类型纪律立好。
parse_dates=['订单日期']的意思是让Pandas在读取时就直接尝试把这一列解析为datetime64类型。这样做的好处是,后面做月度聚合、时间趋势分析都不用再转换。如果你不确定数据里的日期格式是否统一,可以在读取时不加这个参数,后面用pd.to_datetime统一处理。
2.3 导入后的第一件事:看数据全貌
数据读进来之后,先别急着清洗。我的习惯是先花三分钟做一次"体检",看清这份数据到底有什么问题。常用的几行代码:
python复制# 基本信息:行数、列数、每列类型、非空值数量
df.info()
# 前五行预览,看看数据大概长什么样
df.head()
# 数值列的统计摘要
df.describe()
# 每列缺失值数量
df.isnull().sum()
df.info()输出的信息量非常大。看非空值数量时会发现:订单编号、客户ID、金额这些核心字段基本没有缺失,但备注列可能空了将近一半,这个"漏",后期要根据业务决定是删列还是保留。describe()能让你快速对数值列建立直觉:成交金额的平均值、最大最小值、四分位数,一眼扫过去就能发现异常值,比如金额出现负数或者1
