ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Pandas速通指南:从数据清洗到分组聚合的完整路径

2026/8/30 4:11:38 拓冰建站 浏览量
Pandas速通指南:从数据清洗到分组聚合的完整路径 开篇想先说一个很常见的场景你刚拿到一份 50 万行的销售明细表领导要你按区域、按月份统计同比增长率Excel 一打开就卡到转圈VLOOKUP 拉一次要等半分钟筛选完再合并两张表稍不留神就出现“#N/A”。这种时候Pandas 就是大多数 Python 数据分析师和数据开发者的第一选择。很多人会把 Pandas 当成“Python 里的 Excel”这个理解不算错但不够准确。Pandas 的核心价值不是“可视化表格”而是“内存中的结构化数据计算引擎”。它真正解决的问题是用一套统一的数据结构完成读取、清洗、筛选、分组、聚合、合并、透视、输出这一整条数据流水线让分析过程可以用代码复现、扩展和自动化。这篇文章要做的不是罗列 Pandas 的全部 API而是给你一条“2 小时速通”的学习路径。我会沿着一个真实的销售数据分析场景把最核心的知识点串起来。读完你会掌握Series 和 DataFrame 到底是什么、怎么读数据、怎么做数据清洗、怎么做分组聚合、怎么合并多张表、怎么输出结果以及那些最容易踩的坑应该怎么避开。不管你是刚入门 Python 的校招求职者还是用 Excel 做了多年报表想转自动化的业务分析师这篇文章都值得收藏后照着跑一遍。1. 这篇文章真正要解决的问题先说结论Pandas 之所以值得投入时间学是因为它是 Python 数据分析生态的“第一块地基”。NumPy 负责底层数值计算Matplotlib 和 Seaborn 负责可视化Scikit-learn 负责建模而 Pandas 正好卡在“数据接入和特征准备”这个最脏最累的环节。一个典型的数据分析项目80% 的时间都花在读取数据、处理缺失值、纠正类型、筛选样本、构造特征上Pandas 就是专门为这些任务设计的工具。很多学习者的困境并不是“不知道 Pandas 好用”而是“不知道从哪里下手”。打开官方文档几千个方法铺满屏幕光是 DataFrame 的索引方式就能让人绕晕。这篇文章的判断是你不必学完所有 Pandas 方法只需要掌握一条主干路径就是“读数据 - 看数据 - 选数据 - 改数据 - 聚合数据 - 导出数据”。这条路径覆盖了日常工作中大约九成以上的需求。什么人最应该读这篇文章准备做 Python 数据分析或数据科学入门的人Pandas 是简历筛选时的高频考点。做业务分析、运营报表、金融风控、电商数据分析日常要处理中等规模表格数据的人。已经用过 Excel 函数和数据透视表想迁移到 Python 自动化流程的从业者。正在准备数据分析面试需要系统梳理 Pandas 核心知识点的求职者。读完这篇文章你能得到一个可运行的最小学习闭环。不用去啃繁杂的官方教程跟着下面的路径动手跑一遍就能对 Pandas 形成完整的认知地图。后续再碰到具体需求查文档、搜解决方案时也会更有方向感。2. Pandas 核心概念与定位2.1 Series 和 DataFrame 是什么Pandas 里最重要的两个数据结构是 Series 和 DataFrame。Series 可以理解成“带标签的一维数组”。它比 Python 列表多了一个重要的东西索引 index。索引可以理解为每行数据的“名字”默认是 0 到 n-1 的整数但你也可以把它指定为日期、城市名、用户 ID 等更有业务含义的值。DataFrame 则可以理解成“带行索引和列名的二维表格”。每一列都是一个 Series列名相当于表头。DataFrame 的行索引和列索引一起构成了整个表格的坐标系统。用一句更生活化的话来记忆DataFrame 就是一辆公交车每一列是车上不同属性的乘客名单行索引是座位号。2.2 Pandas、Excel 和 SQL 的定位区别工具优势短板Excel上手极快适合小数据量手工操作可视化点选方便几十万行卡顿难以自动化操作不可版本化SQL适合大规模数据查询和聚合天然支持并行复杂清洗、文本处理、统计建模弱Pandas读取灵活清洗能力极强可和 Python 生态无缝衔接受单机内存限制超大 DataFrame 不适合硬扛从学习成本看Pandas 介于 Excel 和 SQL 之间。如果你已经熟悉 Excel 的数据透视表和 VLOOKUP那么理解 groupby 和 merge 会非常快。如果你已经熟悉 SQL 的 SELECT、WHERE、GROUP BY、JOIN那 Pandas 更像是一套 Python 语法的“SQL 引擎”。2.3 Pandas 最容易被误解的地方最容易产生的误解是“Pandas 是给大数据用的”。实际情况是Pandas 适合的是“单机内存能装下”的数据通常在几 GB 以内。几十 GB 或 TB 级的数据应该优先考虑 Spark、Doris、ClickHouse 等分布式方案。Pandas 的真正优势不是“大”而是“灵活”。它能让你在本地快速完成探索性分析也可以作为数据预处理环节把结果输出给后续的大数据平台或机器学习模型。牢记这个定位你就不会在选型上犯错误。3. 环境准备与 Pandas 安装在开始写代码之前先把环境准备好。Pandas 是一个第三方库需要先安装再使用。3.1 Python 版本与 Pandas 版本适配Pandas 对 Python 版本有最低要求。一般情况下Python 3.8 及以上版本都可以安装较新的 Pandas。搜索材料中提到“Python 3.10 与哪个 pandas 版本适配”这里给出稳妥的建议Python 3.10 搭配 Pandas 1.5.3 或 Pandas 2.0.x 都是常见组合。如果你用的是 Python 3.11 或 3.12建议直接安装最新的 Pandas 2.x 版本。为了避免版本冲突更推荐的做法是使用虚拟环境。3.2 在 PyCharm 中安装 Pandas如果你使用的是 PyCharm安装第三方包非常简单。第一步打开 PyCharm进入菜单 File - SettingsWindows或 PyCharm - PreferencesmacOS。第二步找到 Project - Python Interpreter。第三步点击界面左侧的加号在搜索框中输入 pandas。第四步选择要安装的版本点击 Install Package。等待底部进度条完成后就可以在代码中 import pandas 了。3.3 使用 pip 命令安装如果你习惯使用命令行直接在终端中执行pip install pandas如果你需要固定版本可以指定版本号pip install pandas2.0.3安装完成后可以用下面的代码验证是否安装成功import pandas as pd print(pd.__version__)如果输出类似 2.0.3 的版本号说明环境已经就绪。如果是在 Jupyter Notebook 中运行还建议安装一款可视化增强工具pip install pandas-profiling不过这个库不是必须的后面我们会用原生 Pandas 实现核心功能。3.4 确认依赖关系Pandas 依赖 NumPy还会用到 python-dateutil、pytz 等包。使用 pip 安装 pandas 时这些依赖通常会自动装好不用手动处理。如果是在离线环境安装则需要提前下载 whl 文件并确保依赖也一并安装。4. 核心流程拆解从数据读取到数据输出现在我们进入正题。用一条主路径把 Pandas 的基础能力串起来每一步都对应一个真实的分析动作。4.1 读取数据Pandas 支持非常多的数据格式包括 CSV、Excel、JSON、Parquet、Feather、SQL 数据库等。其中 CSV 和 Excel 是日常办公最常用的两种。在项目实战中读取数据前先要搞清楚文件的分隔符、编码、表头情况。很多新手第一次读取中文 CSV 报错问题往往出在 encoding 参数上。import pandas as pd # 读取 CSV 文件指定编码为 utf-8 df pd.read_csv(sales_data.csv, encodingutf-8)如果你不确定文件编码可以把 encoding 参数改为 gbk 尝试df pd.read_csv(sales_data.csv, encodinggbk)读取 Excel 文件则要使用 read_excel它依赖 openpyxl 或 xlrd 引擎。如果你没有安装对应引擎会报错 ImportError。df pd.read_excel(sales_data.xlsx, sheet_nameSheet1)4.2 查看数据概览拿到 DataFrame 后不要急着做处理先了解数据长什么样。# 查看前 5 行 print(df.head()) # 查看数据行列数 print(df.shape) # 查看每列的数据类型和非空值数量 print(df.info()) # 查看数值列的统计描述 print(df.describe())这一步解决的是“这数据能不能直接分析”的问题。如果 info() 显示某列有大量缺失值或者某列类型是 object 但我们希望它是 datetime后续就要专门处理。4.3 选择数据选择数据有三种常见方式按列选择、按行选择、按条件筛选。# 按列名选择单列返回 Series name_series df[customer_name] # 按多个列名选择返回 DataFrame sub_df df[[order_id, customer_name, amount]]按行选择推荐使用 loc 和 iloc。loc 基于“标签索引”iloc 基于“整数位置”。这两者的区别是关键考点。# 选择索引标签为 0 到 2 的行 print(df.loc[0:2]) # 选择位置 0 到 1 的行注意 iloc 不包含结束位置 print(df.iloc[0:2])条件筛选是最常用的操作相当于 SQL 的 WHERE 子句。# 筛选金额大于 1000 的记录 high_amount df[df[amount] 1000] # 多条件筛选金额大于 1000 且 城市为上海 shanghai_high df[(df[amount] 1000) (df[city] 上海)]注意多个条件必须用括号包裹逻辑与用 、逻辑或用 |不能用 Python 的 and 和 or。4.4 处理缺失值和重复值真实数据几乎不可能干干净净缺失值和重复值是我们绕不开的坎。# 检查每列缺失值数量 print(df.isnull().sum()) # 删除包含缺失值的行 df_dropna df.dropna() # 填充缺失值 df[amount].fillna(0, inplaceTrue) # 删除重复行保留第一条 df_deduplicated df.drop_duplicates(subset[order_id], keepfirst)搜索热词中有一条“pandas如果指定两列的值均相同则取第一条数据即可”这其实就是 drop_duplicates 的典型场景。如果你想基于多列去重只需要把列名列表传给 subset 参数。4.5 数据类型转换Pandas 读取数据后列的 dtype 不一定符合业务含义。比如订单日期可能被读成字符串金额可能被读成 object。这时候需要显式转换类型。# 转换为 datetime 类型 df[order_date] pd.to_datetime(df[order_date]) # 转换为数值类型errorscoerce 表示无法转换的置为 NaN df[amount] pd.to_numeric(df[amount], errorscoerce) # 转换为字符串类型 df[order_id] df[order_id].astype(str)4.6 分组聚合分组聚合是 Pandas 中使用频率最高的操作之一等价于 SQL 的 GROUP BY。假设我们想统计每个城市的销售总额city_sum df.groupby(city)[amount].sum() print(city_sum)如果想同时看多个统计量可以使用 aggcity_stats df.groupby(city)[amount].agg([sum, mean, count, max]) print(city_stats)如果按多列分组可以传入列表# 统计每个城市、每个月的销售总额 df[month] df[order_date].dt.to_period(M) monthly_city df.groupby([city, month])[amount].sum().reset_index()reset_index 的作用是把分组后的索引重新变成普通列方便后续透视或导出。4.7 数据合并当你有多张表时需要把数据横向合并。这等价于 SQL 的 JOIN。# 订单表和客户表按 customer_id 合并 merged_df pd.merge(df, customer_df, oncustomer_id, howleft)how 参数控制合并方式常见取值有 inner、left、right、outer。默认是 inner但业务上更常用 left因为我们要保留订单表所有记录。如果只是纵向拼接两张结构相同的表则使用 concatdf_all pd.concat([df_q1, df_q2], axis0, ignore_indexTrue)4.8 数据透视表如果你习惯 Excel 的数据透视表Pandas 的 pivot_table 会非常顺手。pivot pd.pivot_table( df, indexcity, columnsmonth, valuesamount, aggfuncsum, fill_value0 )这样得到的就是一张“城市 x 月份”的销售额矩阵非常适合后续做可视化。4.9 导出数据分析完成后通常需要把结果导出为文件。pandas 提供了 to_csv 和 to_excel 等方法。# 导出为 CSV去掉默认索引 df_result.to_csv(output.csv, indexFalse, encodingutf-8-sig) # 导出为 Excel df_result.to_excel(output.xlsx, indexFalse, sheet_name汇总)这里有一个中文用户经常遇到的坑用 Excel 打开导出的 CSV 中文乱码。解决方法就在 encoding 参数中使用 utf-8-sig 可以保证 Excel 正常识别中文。5. 完整示例用 Pandas 实现一份销售数据分析下面我们用一个完整的销售数据案例把上面的知识点串起来。这个案例模拟的是一张电商订单表包含订单号、客户名、城市、下单日期、金额等字段。5.1 构造模拟数据为了方便演示我们直接构造 DataFrame而不是从文件读取。实际项目中把构造数据换成 read_csv 即可。import pandas as pd # 模拟订单数据 data { order_id: [A001, A002, A003, A004, A005, A006], customer_name: [张三, 李四, 王五, 赵六, 孙七, 周八], city: [上海, 北京, 上海, 广州, 北京, None], order_date: [2024-01-05, 2024-01-08, 2024-02-11, 2024-02-15, 2024-03-01, 2024-03-12], amount: [1200, 500, 2300, 800, None, 1500], status: [已完成, 已完成, 退款, 已完成, 已完成, 已完成] } df pd.DataFrame(data) print(df)5.2 数据清洗# 转换日期类型 df[order_date] pd.to_datetime(df[order_date]) # 处理缺失的城市 df[city] df[city].fillna(未知) # 金额转为数值无法转换的置为 0 df[amount] pd.to_numeric(df[amount], errorscoerce).fillna(0) print(df.info()) print(df.head())5.3 筛选有效订单# 剔除已退款订单 valid_df df[df[status] ! 退款].copy() print(valid_df)5.4 构造月份列并分组统计valid_df[month] valid_df[order_date].dt.to_period(M) # 统计每个城市每月的销售总额 monthly_summary valid_df.groupby([city, month], as_indexFalse)[amount].sum() print(monthly_summary)5.5 查看整体统计描述# 查看订单金额的描述性统计 print(valid_df[amount].describe()) # 找出金额最高的订单 top_order valid_df.loc[valid_df[amount].idxmax()] print(top_order)5.6 输出结果# 输出城市月度汇总 monthly_summary.to_csv(monthly_city_summary.csv, indexFalse, encodingutf-8-sig) print(导出完成)运行这个完整案例后你可以得到两个核心输出一个 DataFrame 形式的城市月度销售统计表一个 CSV 文件。这就是 Pandas 在数据分析项目中的最小闭环。6. 运行结果与效果验证如果你完整运行上面的代码会看到类似如下的输出第一步构造数据后打印原始表order_id customer_name city order_date amount status 0 A001 张三 上海 2024-01-05 1200 已完成 ...第二步清洗后city 列的 None 被填充为“未知”amount 列没有 None。期间不会报错说明转换成功。第三步月度汇总输出city month amount 0 上海 2024-01 1200 1 北京 2024-01 500 2 上海 2024-02 2300 3 广州 2024-02 800 4 北京 2024-03 500 5 上海 2024-03 1500需要注意本例中只有 A003 是退款订单所以统计时被剔除。金额为 None 的 A005 记录因为城市是北京仍然计入 3 月统计且金额为 0。这是业务上常见的处理逻辑具体情况要根据真实需求调整。验证成功的标准有三个程序没有抛异常、关键列类型符合预期、统计结果与手工核算一致。如果你的输出与上面不一致优先检查是否漏了 drop 退款订单这一步或者 groupby 的列名是否写错。7. 常见问题与排查思路7.1 常见报错汇总问题现象可能原因排查方式解决方案读取中文 CSV 乱码编码格式不匹配查看文件真实编码使用 encodingutf-8-sig 或 gbkModuleNotFoundError: pandas未安装或解释器不对检查 PyCharm 解释器路径在正确环境执行 pip install pandasKeyError: 某列名列名写错或前导空格打印 df.columns 查看真实列名使用 df.rename 修正列名日期过滤不生效日期还是字符串类型查看 df.dtypes使用 pd.to_datetime 转换类型转换时报错数据中存在无法转换的字符使用 errorscoerce 查看先清洗脏数据再转类型groupby 后索引混乱未使用 reset_index观察 result 对象使用 as_indexFalse 或 reset_indexSettingWithCopyWarning对切片的副本赋值检查代码是否对 df 切片后操作使用 .copy() 创建显式副本内存占用过高重复读入大文件或类型未优化使用 memory_usage 查看按需读取列或用 category 类型优化7.2 关于 SettingWithCopyWarning 的详细说明这是 Pandas 新手最常见的警告但它不一定是错误。当你写出类似下面的代码时Pandas 会提示你df_filtered df[df[amount] 1000] df_filtered[new_col] 1 # 可能触发警告原因是 df_filtered 可能是原始 df 的视图也可能是一个副本修改结果不确定。稳妥做法是df_filtered df[df[amount] 1000].copy() df_filtered[new_col] 1这样操作的就是独立副本不会影响原始数据也不会出现警告。7.3 关于 Pandas 2.x 与 1.x 的差异现在安装 Pandas 大概率是 2.x 版本。Pandas 2.0 引入了一些行为变化比如默认的字符串类型、复制行为变化等。大部分旧代码在 2.x 下可以直接运行但如果你把项目从 1.x 升级到 2.x建议先跑一遍完整的测试脚本重点检查 groupby 结果类型和日期时间处理是否存在差异。7.4 性能排查思路如果处理几百万行数据时发现 Pandas 很慢第一步不是换框架而是先判断瓶颈在哪里。可以使用下面这些方法只读取需要的列pd.read_csv(..., usecols[col1, col2])将文本类型转为 categorydf[city] df[city].astype(category)使用 inplaceFalse 的链式写法避免中间赋值。用 pip install modin 或 polars 做备选方案。8. 最佳实践与工程建议8.1 用项目驱动学习代替背 APIPandas 的方法很多追求“全部背下来”既低效又痛苦。更合适的方法是给自己找一份真实数据集比如电商订单、股票日线、天气历史、足球比赛统计然后尝试回答业务问题。每遇到一个操作需求再回过头查对应方法。这样学习 2 小时的效果比看一天官方文档更扎实。8.2 保持代码可复现性数据分析代码也是工程代码需要可读、可维护。建议把数据处理流程封装成函数不要把所有逻辑堆在一个 Jupyter Notebook cell 里。示例def load_and_clean_data(path): df pd.read_csv(path, encodingutf-8-sig) df[date] pd.to_datetime(df[date]) df[amount] pd.to_numeric(df[amount], errorscoerce) df df.drop_duplicates(subset[order_id]).copy() return df这样在项目中可以反复复用也方便测试。8.3 保留中间结果数据分析过程中经常需要验证某一步是否正确。建议在关键步骤之后使用 shape、info、head 输出当前结果并记录到笔记中。这种做法可以帮你快速定位是哪一步出了问题。8.4 注意内存管理处理大 DataFrame 时尽量在清洗完成后释放不再使用的内存import gc # 删除中间变量 del df_raw gc.collect()如果数据太大也可以使用 dtypes 优化将 int64 转为 int32 或 category能显著降低内存占用。8.5 和 Excel 分析思维做衔接很多人习惯在 Excel 中看到表格再分析到了 Pandas 里却只看 print 输出。建议初学者把 DataFrame 直接放到 Jupyter Notebook 中展示或者使用 pandasgui 这类可视化交互工具先建立“表格可视”的体验再逐渐过渡到纯代码操作。这样心理负担会小很多。8.6 关于与 NumPy 和可视化库的配合Pandas 的底层是 NumPy所以很多运算逻辑与 NumPy 一致。如果你后续要做机器学习特征工程或者把数据传给 Matplotlib 绘图Pandas 与 NumPy 的无缝衔接会带来极大便利。建议在学 Pandas 的同时把 NumPy 的基本操作也过一遍比如数组创建、索引、广播机制。不需要太深入掌握基础即可。8.7 生产环境选择如果只是本地做分析或出报告Pandas 足够。但如果你要把流程部署成定时任务并用在大规模离线数据上建议考虑以下方案使用 PySpark 代替 Pandas处理 TB 级数据。使用 Polars 代替 Pandas追求更好的单机性能。使用数据库 SQL 完成部分聚合再在应用层用 Pandas 加工。这在数据量超过单机内存时尤其重要。9. 总结与后续学习方向这篇速通教程的核心目标是帮你用最短的时间建立 Pandas 的完整知识骨架。你掌握了 Series 和 DataFrame 两个核心数据结构掌握了读取、预览、筛选、清洗、分组、合并、透视、导出这几个高频操作也学会了排查最常见的报错和性能问题。这些内容足够覆盖大部分日常数据分析任务。下一步的实践路线可以分三条走。第一条是“深挖数据清洗”。找一份有缺失值、重复值、异常值、格式混乱的真实数据把自己当作唯一负责人把所有数据问题都清理干净并写出可复用的清洗脚本。第二条是“强化业务分析”。找一个具体的业务问题比如“分析某电商平台的复购率”“按城市分析销售趋势”“分析足球比赛数据集中的胜负因素”。这些综合性能训练能够把分组聚合、多表合并、透视表串起来。第三条是“走向数据可视化”。Pandas 的 plot 方法可以直接调用 Matplotlib 绘图也可以用 Seaborn 做更美观的统计图。可视化和 Pandas 结合才能让你的分析结果真正被业务方理解。如果你感到某些内容记住了但不会用这是正常现象。建议收藏本篇文章在动手做项目时把它当操作手册来翻。工具类的知识只有在“遇到问题 - 查方法 - 跑通 - 理解原理”这个循环中才会真正变成你自己的能力。