Pandas 2小时速通:数据清洗与分组聚合实战指南 如果你正在准备数据分析面试、要处理表格类数据或者想把 Excel 里那套手工操作换成脚本化处理Pandas 基本是绕不开的第一站。这篇教程按“2 小时速通”的节奏设计从环境安装到数据清洗、分组聚合、合并关联、格式落地再到可视化全部用短代码示例带过一遍。核心原则只有一个先跑起来再理解概念。1. Pandas 核心能力速览能力项说明项目类型Python 数据处理与分析库核心数据结构Series一维、DataFrame二维主要功能数据读取、清洗、筛选、排序、分组、聚合、合并、透视、可视化支持数据格式CSV、Excel、JSON、Parquet、Feather、SQL、HTML 等推荐环境Python 3.9 及以上Pandas 2.x 版本硬件要求普通办公电脑即可无需 GPU安装方式pip / conda 安装是否支持 API作为 Python 库直接导入使用是否支持批量任务支持可通过循环、函数化批处理多个文件适合场景数据清洗、业务报表、面试笔试、数据分析实战、机器学习预处理从表格可以看出来Pandas 不是重型框架它更像是数据分析的“基础工具包”。没有独立服务、没有 WebUI、不需要显存安装后直接在脚本或 Jupyter Notebook 里用。2. 适用场景与使用边界Pandas 最常见的落地场景有三类。第一类是表格数据清洗。Excel 里做的去重、替换、分列、缺失值填充、类型转换在 Pandas 里几行代码就能完成而且可以一次处理几百兆甚至几个 G 的数据文件。第二类是业务分析。按日期、地区、品类做分组汇总计算同比环比、排名、占比Pandas 的groupby和pivot_table基本覆盖了 90% 的业务报表需求。第三类是数据分析和机器学习预处理。Pandas 和 NumPy、Matplotlib、Scikit-learn 配合完成特征工程、数据切分、标签构造等流程。使用边界也需要说清楚Pandas 适合单机中等规模数据处理几千万行级别没问题但 TB 级数据建议转向 Spark、DuckDB 或 Dask。Pandas 不擅长流式计算和实时处理。涉及生产级数据管道时建议用专门的数据工程框架Pandas 更适合做分析和探索。数据来源涉及个人信息、商业数据或受版权保护内容时必须先确认授权和合规要求学习时使用公开示例数据或自制数据。3. 环境准备与安装开始之前先用命令确认 Python 环境是否正常。python --version pip --version不同操作系统的 Python 安装方式有差异但核心要求是 Python 3.9 以上。如果你用的是 PyCharm可以直接在项目解释器里安装 Pandas也可以使用终端命令。Pandas 官方发布版本与 Python 版本有对应关系。一般来说Python 3.10 可以直接安装 Pandas 2.x 系列最新安装时 pip 会自动挑选适配的版本。安装命令如下pip install pandas如果你需要读 Excel 文件还需要安装 openpyxl 或 xlrd 引擎pip install openpyxl建议再安装 NumPy、Matplotlib方便后续做数值计算和可视化pip install numpy matplotlib安装完成后在 Python 里验证一下import pandas as pd print(pd.__version__)能输出版本号就说明安装成功。如果你用的是 PyCharm这里有几个常见坑右下角解释器选择错误确认当前项目使用的解释器是安装了 Pandas 的那个 Python 环境而不是系统全局环境。终端执行 pip 和 PyCharm 内部安装不一致尽量统一使用 PyCharm 的Python Packages面板或统一使用终端。网络源慢国内环境可以临时切换镜像源但要注意镜像源的选择和安全性。pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple4. 数据读取与写出Pandas 的数据读取入口是pd.read_*系列函数数据写出是to_*系列方法。这里按常用格式逐个演示。4.1 CSV 文件读写CSV 是最常见的表格数据格式业务数据导出、面试题目、竞赛数据集基本都在用。import pandas as pd df pd.read_csv(data.csv) print(df.head())写入 CSV 时如果不想保留默认的行索引要加indexFalsedf.to_csv(output.csv, indexFalse, encodingutf-8-sig)utf-8-sig是为了防止 Excel 打开 CSV 乱码。如果字段中包含逗号或换行Pandas 会自动按 CSV 规范处理引号。4.2 Excel 文件读写读取 Excel 需要额外安装 openpyxldf pd.read_excel(报表.xlsx, sheet_nameSheet1)指定读取某些列df pd.read_excel(报表.xlsx, usecols[订单号, 金额, 日期])写出 Exceldf.to_excel(output.xlsx, sheet_name结果, indexFalse)一个 Excel 文件写多个 sheet需要用到 ExcelWriterwith pd.ExcelWriter(多表输出.xlsx) as writer: df1.to_excel(writer, sheet_name汇总, indexFalse) df2.to_excel(writer, sheet_name明细, indexFalse)4.3 Parquet 与 Feather 高性能格式这是比较进阶的用法也是很多数据分析岗面试会问的点。Parquet 和 Feather 都是列式存储格式优点是压缩率高、读取速度快非常适合大数据量反复读取的场景。相比 CSVParquet 在几百万行级别的数据上读取速度能提升数倍。# 写出 Parquet df.to_parquet(data.parquet, indexFalse) # 读取 Parquet df pd.read_parquet(data.parquet)Feather 格式更轻量适合 Python 和 R 语言之间交换数据df.to_feather(data.feather) df pd.read_feather(data.feather)这两个格式在 Spark 生态里也很常用。Pandas 处理后的数据可以导出为 Parquet 交给 Spark 读取实现单机分析和分布式计算的衔接。4.4 JSON 与数据库读取# 读取 JSON df pd.read_json(data.json) # 从数据库读取 import sqlite3 conn sqlite3.connect(database.db) df pd.read_sql_query(SELECT * FROM orders, conn)5. DataFrame 基础操作DataFrame 是 Pandas 最核心的数据结构。你可以把它理解成一个带有列名和行索引的表格。5.1 创建 DataFrameimport pandas as pd data { 姓名: [张三, 李四, 王五, 赵六], 部门: [技术部, 市场部, 技术部, 财务部], 薪资: [12000, 9500, 15000, 8000], 入职日期: [2023-01-15, 2022-06-01, 2024-03-12, 2021-11-20] } df pd.DataFrame(data) print(df)输出效果是姓名 部门 薪资 入职日期 0 张三 技术部 12000 2023-01-15 1 李四 市场部 9500 2022-06-01 2 王五 技术部 15000 2024-03-12 3 赵六 财务部 8000 2021-11-205.2 查看基本结构# 查看前5行 print(df.head()) # 查看列信息 print(df.info()) # 查看数值分布 print(df.describe()) # 查看列名 print(df.columns)info()能看到每列的非空数量、数据类型describe()会输出计数、均值、标准差、最小值、四分位数、最大值。拿到一份新数据后先执行这几个方法基本就能知道数据长什么样。5.3 选列与选行# 选择单列返回 Series print(df[薪资]) # 选择多列返回 DataFrame print(df[[姓名, 部门]]) # 按位置选行前两行 print(df.iloc[:2]) # 按条件选行 print(df[df[薪资] 10000])5.4 新增列与删除列# 新增一列计算年薪 df[年薪] df[薪资] * 12 # 新增列根据条件赋值 df[职级] df[薪资].apply(lambda x: 高级 if x 12000 else 普通) # 删除列 df df.drop(columns[年薪])apply是 Pandas 里非常灵活的用法对每行或每列应用一个函数适合做复杂字段拆分、标准化等操作。6. 数据清洗数据分析工作中数据清洗往往占掉一半以上的时间。这里整理出最常用的清洗操作。6.1 缺失值处理# 查看缺失值情况 print(df.isnull().sum()) # 删除含有缺失值的行 df_clean df.dropna() # 用固定值填充 df[薪资] df[薪资].fillna(0) # 用均值填充 df[薪资] df[薪资].fillna(df[薪资].mean()) # 向前填充用上一条数据填充空值 df[备注] df[备注].fillna(methodffill)6.2 重复值处理重点说一个面试高频题如果指定两列的值均相同则保留第一条数据。# 根据姓名和部门两列去重保留第一条 df_unique df.drop_duplicates(subset[姓名, 部门], keepfirst)keep参数有三个选项keepfirst保留先出现的行keeplast保留最后出现的行keepFalse所有重复行都删除6.3 数据类型转换数据类型不对是常见问题。比如从 CSV 读入的“日期”列经常是字符串类型。# 查看数据类型 print(df.dtypes) # 将字符串转为数值 df[薪资] pd.to_numeric(df[薪资], errorscoerce) # 将字符串转为日期 df[入职日期] pd.to_datetime(df[入职日期]) # 将数值转为字符串 df[部门编号] df[部门编号].astype(str) # 自定义转换函数 df[金额_千元] df[金额] / 1000errorscoerce表示遇到无法转换的值就置为 NaN而不是报错中断这个策略在清洗脏数据时非常实用。6.4 字段拆分与替换# 拆分列比如“姓名-部门”拆成两列 df[[姓名, 部门]] df[姓名-部门].str.split(-, expandTrue) # 替换值 df[部门] df[部门].replace(技术部, 研发部) # 去除字符串空格 df[姓名] df[姓名].str.strip()6.5 条件筛选与过滤# 多条件筛选 df_filtered df[(df[薪资] 8000) (df[部门] 技术部)] # 使用 isin df_filtered df[df[部门].isin([技术部, 市场部])] # 按字符串模糊筛选 df_filtered df[df[姓名].str.contains(张)]7. 排序、分组聚合与透视表7.1 排序# 按薪资从大到小排序 df_sorted df.sort_values(薪资, ascendingFalse) # 多列排序 df_sorted df.sort_values([部门, 薪资], ascending[True, False])7.2 分组聚合分组聚合是数据分析的绝对核心。SQL 里的group by在 Pandas 里对应groupby# 按部门分组计算平均薪资 group_result df.groupby(部门)[薪资].mean() print(group_result)同时算多个指标group_result df.groupby(部门)[薪资].agg([mean, sum, max, min, count]) print(group_result)7.3 分组后做多列不同操作group_result df.groupby(部门).agg({ 薪资: mean, 姓名: count, 业绩: sum })agg后面可以传字典为每一列指定不同的聚合函数。这个写法在面试中非常容易被考察也是业务分析最常用的写法。7.4 透视表透视表相当于 Excel 里的数据透视表功能pivot pd.pivot_table( df, index部门, columns季度, values销售额, aggfuncsum, fill_value0 ) print(pivot)7.5 交叉表交叉表更适合统计频次cross pd.crosstab(df[部门], df[季度]) print(cross)8. 数据合并与连接数据合并通常有两种场景堆叠和连接。8.1 纵向堆叠当多个表字段完全一致时可以纵向合并import pandas as pd df1 pd.DataFrame({姓名: [张三, 李四], 薪资: [10000, 12000]}) df2 pd.DataFrame({姓名: [王五, 赵六], 薪资: [9000, 11000]}) df_all pd.concat([df1, df2], axis0, ignore_indexTrue)8.2 横向拼接字段不同的表按行索引横向拼接df_merge pd.concat([df1, df2], axis1)8.3 类似 SQL 的 Join业务分析中最常见的操作是两张表通过某个字段关联# 订单表 orders pd.DataFrame({ 订单号: [A001, A002, A003], 客户ID: [C1, C2, C3], 金额: [100, 200, 150] }) # 客户表 customers pd.DataFrame({ 客户ID: [C1, C2, C4], 客户名称: [甲公司, 乙公司, 丁公司] }) # 左连接按客户ID关联 result orders.merge(customers, on客户ID, howleft) print(result)how参数常用值有inner只保留两边都匹配的行left保留左边全部行右边匹配不上为 NaNright保留右边全部行左边匹配不上为 NaNouter保留两边所有行9. 批量任务处理Pandas 本身没有专门的批量任务引擎但通过 Python 的循环和函数化封装可以轻松实现多文件批量处理。9.1 批量读取多个 CSVimport pandas as pd import glob file_list glob.glob(daily_data/*.csv) df_list [] for file in file_list: temp_df pd.read_csv(file) df_list.append(temp_df) # 把所有文件纵向合并 all_data pd.concat(df_list, ignore_indexTrue) print(all_data.shape)9.2 批量处理并保存for file in file_list: df pd.read_csv(file) # 清洗和转换逻辑 df df.drop_duplicates(subset[订单号], keepfirst) df[日期] pd.to_datetime(df[日期]) # 保存为 Parquet output_path processed/ file.split(/)[-1].replace(.csv, .parquet) df.to_parquet(output_path, indexFalse)实际生产场景中建议封装成函数方便后续加日志和失败重试from pathlib import Path def process_file(input_path: Path, output_dir: Path): df pd.read_csv(input_path) df df.dropna(subset[金额]) df[处理时间] pd.Timestamp.now() output_path output_dir / f{input_path.stem}.parquet df.to_parquet(output_path, indexFalse) return output_path for csv_path in Path(daily_data).glob(*.csv): try: result_path process_file(csv_path, Path(processed)) print(f成功: {csv_path} - {result_path}) except Exception as e: print(f失败: {csv_path}, 错误: {e})10. 数据分析与可视化Pandas 内部自带plot方法底层基于 Matplotlib。虽然不如专业可视化库精细但做快速分析足够。10.1 基础绘图import matplotlib.pyplot as plt # 让图片在 Jupyter 中直接显示 %matplotlib inline # 按部门统计平均薪资并绘制柱状图 df.groupby(部门)[薪资].mean().plot(kindbar) plt.title(各部门平均薪资) plt.ylabel(平均薪资) plt.xticks(rotation45) plt.show()10.2 折线图处理时间序列数据时折线图最直观# 按日期汇总销售额再画折线图 df[日期] pd.to_datetime(df[日期]) df.set_index(日期).resample(D)[销售额].sum().plot(kindline) plt.show()resample(D)是按天重采样换成W按周、M按月。这是时序分析中最高频的操作。10.3 直方图与箱线图# 薪资分布直方图 df[薪资].hist(bins20) # 各部门薪资分布箱线图 df.boxplot(column薪资, by部门) plt.show()可视化只是辅助验证手段重点是观察数据分布和异常值不要为了画图而画图。11. 资源占用与性能观察Pandas 在普通办公电脑上就能跑但数据量大时仍然要注意资源占用。11.1 观察内存占用# 查看 DataFrame 整体内存占用 print(df.memory_usage(deepTrue).sum() / 1024 / 1024, MB)一条简单的内存检查可以帮你判断当前数据是否适合用 Pandas 处理。单文件超过 1GB 时建议先抽样测试或者使用read_csv的nrows参数只读一部分df_sample pd.read_csv(big_file.csv, nrows10000)11.2 降低内存的方法优先筛选列不用的列直接不读df pd.read_csv(big_file.csv, usecols[订单号, 金额, 日期])使用category类型压缩重复值高的列df[部门] df[部门].astype(category)将数值型降位float64转为float32int64转为int32。11.3 性能观察技巧处理几千行时Pandas 几乎是瞬时完成处理几百万行时建议关注操作耗时使用time模块或 Jupyter%%time魔法命令。内存变化使用系统资源监视器或结合memory_usage分阶段打印。I/O 耗时CSV 读取远慢于 Parquet 和 Feather高频读取场景优先用列式格式。12. 常见问题与排查方法问题现象可能原因排查方式解决方案pip install pandas安装失败pip 版本过低或 Python 版本过旧执行python --version和pip --version升级 pip或升级 Python 到 3.9安装速度慢默认 PyPI 源网络不稳定检查网络连接更换镜像源或重试ModuleNotFoundError: No module named pandasPyCharm 使用了解释器错误查看 PyCharm 右下角解释器切换解释器或重新安装 Pandas读取 Excel 报错缺少 openpyxl 或 xlrd 引擎查看报错信息pip install openpyxlsort_values后中文排序不对未指定排序规则观察排序结果使用key参数或按转换后的拼音列排序去重后行数异常subset参数未指定检查代码指定subset列范围CSV 写入后 Excel 中文乱码编码不对用文本编辑器打开验证使用encodingutf-8-sig日期列处理报错数据中混有非日期值打印该列唯一值pd.to_datetime(..., errorscoerce)数据量很大时内存爆掉一次性读取全部数据检查memory_usage分块读取或改用 Parquet 格式concat后索引重复未重置索引查看结果加ignore_indexTrue批量处理中某个文件失败单个文件格式异常打日志定位文件使用try-except捕获并跳过可视化中文乱码Matplotlib 字体配置问题查看绘图结果配置中文字体如plt.rcParams[font.sans-serif] [SimHei]13. 最佳实践与使用建议第一第一次拿到数据时先执行head()、info()、describe()把数据的列名、类型、缺失情况、数值范围摸清楚再开始处理。盲目写清洗代码容易踩坑。第二清理脏数据是一个反复迭代的过程建议把清洗流程封装成独立函数方便每次读取新文件后直接复用。不要每次手工复制代码。第三重要数据处理前先做备份处理流程加上中间结果打印比如处理前后行数对比、缺失值数量对比。这样能及时发现逻辑错误。第四数据处理脚本要养成加日志的习惯。批量任务中每条文件处理成功或失败都记录下来失败时保留原始文件方便重新处理。import logging logging.basicConfig( levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s ) def process_file(file_path): try: df pd.read_csv(file_path) # 处理逻辑 df.to_parquet(output.parquet) logging.info(f文件处理成功: {file_path}) except Exception as e: logging.error(f文件处理失败: {file_path}, 错误: {e})第五涉及商务数据和个人信息的数据分析项目要在授权和合规前提下进行。学习阶段尽量使用公开数据集或自己构造的数据避免直接使用真实业务数据截图和导出文件。第六面试和笔试方面Pandas 高频考点集中在groupby、merge、pivot_table、drop_duplicates、to_datetime、fillna、apply这几个方法建议每个方法都手写一遍完整示例而不是只看不练。第七学习路径上先掌握 Series 和 DataFrame 基础操作再学数据清洗和筛选然后学分组聚合和合并最后学批量处理和可视化。按照“读数据 - 清洗 - 分析 - 输出”的流程做三个完整案例基本上就能覆盖日常工作核心场景。14. 总结与下一步Pandas 是数据分析工具链中最基础、最实用的一环。它的优点在于学习曲线平缓、社区资料充足、与 Excel 操作可以对应理解。2 小时速通的核心思路是优先掌握高频操作不要一开始纠结于底层实现而是围绕“读写数据 - 清洗数据 - 分组聚合 - 合并关联 - 结果输出”这条主线建立完整的处理流程。最容易踩的坑集中在三个方面环境配置错误导致无法导入、数据清洗时忽略缺失值和类型转换、批量任务没有日志导致难以排查。建议你按照本文的代码示例在本地 Python 环境或 Jupyter Notebook 里逐段运行并准备一份包含日期、金额、部门、客户 ID 的模拟数据把去重、分组、透视表、合并全部跑一遍。下一步可以继续扩展的方向学会用 Pandas 与 NumPy 配合做特征工程再用 Matplotlib 或 Seaborn 做探索性分析然后过渡到用 Sklearn 做机器学习建模。Pandas 不是终点它是通往更深层数据分析的起点。建议把本文收藏备用编写代码时遇到格式转换、去重、合并、聚合的问题可以直接回来查示例。