ARTICLE DETAIL

建站实战干货

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

Pandas入门指南:2小时掌握DataFrame数据清洗与分组聚合

2026/8/30 9:21:05 拓冰建站 浏览量
Pandas入门指南:2小时掌握DataFrame数据清洗与分组聚合 很多人在第一次打开 Pandas 官方文档时面对几百个方法很容易觉得“入门”是一件很难的事。尤其是用过 Excel 的人会产生一个更直观的困惑Excel 里点几下就完成的筛选、求和、排序为什么到了 Pandas 里还要写一行行代码这是 Pandas 入门时最大的认知门槛也是本文想重点解决的问题。Pandas 不是让你把简单的操作变复杂而是帮你把重复、耗时、无法回溯的表格处理流程转化为可复用、可自动化、可验证的数据分析脚本。它的学习重点不是“记住每个 API”而是先建立“一张表在代码里是什么样的”这个基本认知。这篇文章给你规划的 2 小时目标非常具体读完一遍你能独立把一份 CSV 格式的订单表读进程序完成缺失值清理、重复值处理、类型转换再基于分组聚合得出“不同分类的销售额、订单量、客单价”这类结论最后把分析结果导出成一张新表。这就是日常工作中最常见、也最刚需的数据分析流程。如果你能跑通这条通路就已经超过了大多数停留在“了解概念”阶段的初学者。整篇文章的实践路径是先理解 Series 和 DataFrame 两个核心对象再准备好环境然后用一个小型订单数据走一遍“读取数据 → 清洗数据 → 筛选数据 → 分组聚合 → 导出结果”的完整流程。每部分都会配合直接可运行的代码示例并在最后给出常见问题和工程建议。1. 这篇文章真正要解决的问题先说说新手学 Pandas 最常见的三个困境。第一个困境是“文档看不进去”。Pandas 文档确实很全但全到让新手不知道该从哪里开始。你知道merge、pivot_table、rolling这些方法听说过但不知道日常工作里它们到底对应哪个场景。文档本身是“字典”式的不是“入门教程”式的直接翻开它很容易被庞大的 API 数量劝退。第二个困境是“教程太散”。网上很多 Pandas 教程是逐个讲函数今天讲read_csv明天讲groupby后天讲apply。每个函数看懂了但遇到真实数据时还是不知道第一步该干什么第二步该干什么。真正的数据分析是有固定流程的这个流程就是“读取、查看、清洗、筛选、聚合、导出”。如果你没有一个完整的流程感知识就永远是碎片。第三个困境是“动手太少”。数据分析是实践学科只看代码不敲代码相当于学游泳不下水。很多人卡住的不是概念难而是电脑上没有合适的运行环境或者照着代码敲到一半因为一个小语法错误就放弃了然后误以为自己不适合学编程。这篇文章要解决的就是这三点。它不追求把 Pandas 所有知识点全部覆盖而是把“用 Pandas 完成一次基础数据分析”的最小知识集提炼出来再教你按流程组织这些知识。给一个明确判断Pandas 入门最核心的不是记忆函数而是形成“数据思维”。所谓数据思维就是拿到一份数据后能立刻知道要先看结构、再查异常、再做分析、最后出结果。2 小时完全足够建立这种思维和对应的操作能力。2. Pandas 核心概念Series 和 DataFrame2.1 从“表格”出发理解 Pandas先不要急着记概念。你先回忆一下 Excel 里的表格长什么样有行号有列名每一列可能是数值、文本或日期。Pandas 里的 DataFrame 本质就是这样一个对象只不过它是在内存中用 Python 对象表示的二维表。DataFrame 的“列”在 Pandas 中叫做 Series。Series 可以理解为“带标签的一维数组”它有索引也有值。一个 DataFrame 可以看作“多个 Series 纵向拼在一起”每个 Series 对应一列。用表来表示两者的区别对象维度类比物核心成员Series一维Excel 中的一列index索引、values值DataFrame二维一张 Excel 工作表columns列名、index行索引、values数据块这里最适合用一个真实场景来理解。假设你拿到一份销售订单数据订单编号城市销售额订单日期1001上海9982025-01-011002北京3202025-01-02在 Pandas 中可以这样创建这个 DataFrameimport pandas as pd data { 订单编号: [1001, 1002], 城市: [上海, 北京], 销售额: [998, 320], 订单日期: [2025-01-01, 2025-01-02] } df pd.DataFrame(data) print(df)输出如下订单编号 城市 销售额 订单日期 0 1001 上海 998 2025-01-01 1 1002 北京 320 2025-01-02这个示例虽简单但它说明了一件事我们平时用 Excel 看到的“表”在 Pandas 中就是一个 DataFrame。之后的全部操作本质上都是对这个二维对象做“取行、取列、过滤、计算、分组、汇总”。2.2 新手最容易出现的误区新手最容易犯的误区是把 DataFrame 当成 Python 里的二维 list 来用。二维 list 只能通过[行下标][列下标]的方式访问而 DataFrame 有更丰富的访问方式。例如你想取出“销售额”这一列正确的做法是# 推荐按列名取列 print(df[销售额])如果你用二维 list 的思维写成df[0]就会得到完全不同的结果甚至报错。Pandas 中df[0]表示“按行索引取行”的语义而不是取第一列。这个阶段的小结论是学习 Pandas 时要把每一行代码思考成“对一张表做了什么”比如“取出某一列”“筛选某些行”“按某一列排序”。当你把每次操作都映射到表结构上而不是停留在记忆语法层面学习速度会快很多。3. 环境准备安装 Pandas 的最稳妥方式3.1 环境说明Pandas 是基于 Python 的数据分析库因此前提是先有一个可用的 Python 环境。官方目前对 Python 版本有明确的支持范围具体以官网说明为准。对于新手我的建议是使用 Python 3.9 及以上版本这样在安装 Pandas 时兼容性问题最少。如果你使用的是 PyCharm可以通过项目解释器直接安装也可以使用命令行安装。两者效果一样核心命令就一条pip install pandas这条命令会自动安装 Pandas 本身同时会拉取它依赖的 numpy、python-dateutil 等基础库不需要你手动逐个安装。有些读者用的是 Anaconda 环境对应的命令是conda install pandas3.2 在 PyCharm 中安装 Pandas如果你的电脑里已经装了 PyCharm最简单的操作路径是打开 PyCharm创建一个新项目。点击左下角的Python Packages窗口。在搜索框中输入pandas。点击右侧的Install按钮。这种方式的好处是PyCharm 会自动识别当前项目用的 Python 解释器把包安装到正确的虚拟环境中不容易出现“命令装好了但项目里用不了”的情况。如果你更习惯命令行方式也可以先用python -m venv venv创建虚拟环境激活后再执行pip install pandas。不过对于 2 小时入门这个目标来说跳过虚拟环境、直接使用全局环境也完全可以关键是把流程跑通。3.3 验证安装是否成功安装完成后验证方式很简单import pandas as pd print(pd.__version__)如果能正常输出版本号比如2.2.3说明环境已经准备好了。这里要提醒一个常见问题如果安装后运行import pandas提示找不到模块一般不是安装失败而是 PyCharm 当前选中的 Python 解释器和安装 pandas 时用的解释器不是同一个。解决方法是在 PyCharm 的Settings - Project - Python Interpreter中确认当前解释器路径再重新安装一次。4. 数据读取先把数据拿进来再谈分析4.1 读取 CSV 文件Pandas 最常用的数据读取操作就是读 CSV 文件。假设本地有一个orders.csv文件包含订单数据读取代码只有一行import pandas as pd df pd.read_csv(orders.csv)这件事看起来简单但真实项目中经常会出现三类问题文件路径不对、中文乱码、列名不匹配。对于新手建议先给文件一个绝对路径减少路径问题df pd.read_csv(C:/Users/你的用户名/Desktop/orders.csv)如果 CSV 中包含中文推荐显式指定编码df pd.read_csv(orders.csv, encodingutf-8)有些老文件是gbk编码则改成df pd.read_csv(orders.csv, encodinggbk)4.2 快速认识数据读进来之后不要急着做分析先用三个方法快速了解这张表。# 查看前5行 print(df.head()) # 查看表的行列数 print(df.shape) # 查看每一列的数据类型和非空情况 print(df.info())head()默认显示前 5 行你可以传入数字查看前 N 行。shape返回(行数, 列数)元组比如(1000, 6)表示 1000 行、6 列。info()会列出每一列的名称、数据类型、非空值数量这是判断数据是否需要清洗的第一个依据。4.3 关于 Parquet、Feather 等格式对于日常练习和中小型数据集CSV 足够了。如果是大数据集压缩的格式在实践中也经常用 parquet、feather 等方式这在 pandas 中也有对应接口# 读取 parquet 格式 df2 pd.read_parquet(orders.parquet) # 读取 feather 格式 df3 pd.read_feather(orders.feather)Parquet 和 Feather 的优势在于读取速度快、文件体积小适合离线分析、数据仓库场景。对于第一次接触 Pandas 的读者知道“Pandas 不仅能读 CSV还能读各种列式格式”这个信息就够了2 小时内不需要深入。这个小节的结论是读取数据只是热身真正重要的工作是“认识这张表”。如果你连数据有多少行、哪些列、哪些列有缺失都不知道分析就是盲人摸象。5. 数据清洗三件套缺失值、重复值、类型转换5.1 为什么清洗是数据分析中最耗时的一步真实世界给到的数据很少是干净的。你可能会拿到空值、重复记录、字符串格式的金额、错误日期。这就是为什么数据分析流程中数据清洗经常占据一半以上时间。清洗工作有三类最基础的任务处理缺失值、删除重复值、转换数据类型。把这三件事做对后面的分析质量才有保障。5.2 缺失值处理先看哪些列有缺失值print(df.isnull().sum())如果某些列缺失数据很少最直接的办法是删除有缺失的行df.dropna(inplaceTrue)inplaceTrue表示原地修改 df。对于新手建议尽量少用inplace而是使用赋值方式df df.dropna()两者的区别在于后者更符合函数式写法可读性更好也不容易因为原地修改造成连锁问题。如果缺失值很关键比如“销售额”为空删除整行可能会损失信息此时可以考虑填充df[销售额] df[销售额].fillna(0)5.3 重复值处理重复值处理对应的场景正好是热搜词里出现过的“如果指定两列的值均相同则取第一条数据即可”。先查看重复情况duplicate_mask df.duplicated() print(duplicate_mask.sum())删除所有列完全相同的重复行df df.drop_duplicates()如果只根据“订单编号”和“城市”两列判断是否重复保留第一条df df.drop_duplicates(subset[订单编号, 城市], keepfirst)keepfirst表示保留第一次出现的记录keeplast表示保留最后一次keepFalse表示删除所有重复记录。这个参数在不同业务场景下含义不同订单流水一般保留第一条即可。5.4 数据类型转换Pandas 中常见的坑是把“数值”存成了“字符串”。比如 Excel 导出 CSV 后金额列可能出现1,234这种带逗号的文本直接计算就会报错或得到错误结果。查看类型print(df.dtypes)使用astype转换df[销售额] df[销售额].astype(float)如果列中带有逗号或千分符需要先清洗再转换df[销售额] df[销售额].str.replace(,, ).astype(float)日期列也需要转换方便后续按时间做聚合df[订单日期] pd.to_datetime(df[订单日期])这个阶段的小结论是清洗的本质是让 Pandas 对数据的“默认理解”与业务实际一致。缺失值影响的是统计口径重复值影响的是计数错误类型影响的是运算。每次拿到新数据先在这三项上检查一遍是最稳妥的做法。6. 数据筛选与排序组合条件不迷路6.1 布尔索引筛选的核心筛选是数据分析最常用的操作。“找出销售额大于 1000 的记录”“找出上海和北京的订单”这些需求的实现方式都依赖布尔索引。布尔索引的逻辑是先构造一个由 True/False 组成的条件序列再把它放到df的方括号中True 对应的行会被保留。最简单的方式condition df[销售额] 1000 result df[condition]6.2 多条件组合多条件时新手最常踩的坑是写and/or。Pandas 中必须使用且和|或并且每个条件最好用括号包起来# 找出销售额大于1000且城市为上海 condition1 df[销售额] 1000 condition2 df[城市] 上海 result df[condition1 condition2]注意是比较运算不能写成单个。如果使用~表示取反比如“不是上海”result df[~condition2]6.3 排序排序用sort_values# 按销售额从大到小排序 df_sorted df.sort_values(销售额, ascendingFalse)如果想按多列排序可以传入列表df_sorted df.sort_values([城市, 销售额], ascending[True, False])这里需要注意sort_values默认不会原地排序返回的是一个新的 DataFrame。如果你想让当前变量改变要重新赋值df df.sort_values(销售额, ascendingFalse)6.4 一个容易混淆的点新手容易混淆“按列筛选”和“按行筛选”。df[销售额]是取列df[df[销售额] 0]是取行。如果一时反应不过来就记一个原则括号里面放一个布尔条件序列的时候一定是在筛行。这个小节的结论是筛选是数据分析的语言。它让你从全量数据中把需要的子集拿出来而不是用眼睛在 Excel 里一行行找。7. 分组聚合数据分析真正“出结论”的地方7.1 为什么必须学 groupby前面几步只是“整理数据”到分组聚合这一步才真正开始“得出指标”。面试中高频出现的 Pandas 问题几乎同时也是业务中最常用的操作按某个维度分组计算总和、平均值、计数。比如“每个城市的销售额”“每个月的订单数”“每个品类的客单价”这些全部来自groupby。7.2 基础分组聚合继续用订单数据举例按城市分组统计销售额总和result df.groupby(城市)[销售额].sum() print(result)这个操作可以用中文描述为按“城市”列分组取出每组中“销售额”列求和。结果是一个 Series索引是城市名。如果想一次得到多个统计量使用aggresult df.groupby(城市)[销售额].agg([sum, mean, count, max]) print(result)输出类似sum mean count max 城市 上海 1996 998.0000 2 1998 北京 320 320.0000 1 3207.3 groupby 结果转为 DataFramegroupby结果默认的索引是分组字段。如果你希望分组字段也作为普通列存在注意reset_indexresult df.groupby(城市)[销售额].sum().reset_index()或者在groupby时指定as_indexFalseresult df.groupby(城市, as_indexFalse)[销售额].sum()这两种方式得到的都是常见的二维表结构方便后续导出或继续处理。7.4 多列分组业务中经常有“每个城市、每个产品分类的订单量”这类需求分组列可以传入多个字段result df.groupby([城市, 商品分类]).agg( 订单量(订单编号, count), 销售额合计(销售额, sum) ).reset_index()这段代码中agg接收一个字典或关键字参数(订单编号, count)的含义是“对订单编号列执行计数”(销售额, sum)是“对销售额列执行求和”。这个小节的结论是groupby 让数据从明细形态进入汇总形态是你从数据里提取信息的分水岭。学习时先会用sum、mean、count三个基础统计量再逐步接触agg的组合用法就足够应对 80% 的日常工作。8. 综合实战用一份订单数据跑通 2 小时练习8.1 练习目标下面我们用一个完整案例把前面所有知识点串起来。目标如下创建一份模拟订单数据。清洗缺失值和重复值。转换日期与金额类型。筛选出“已支付”订单。按城市和商品分类统计销售额与订单量。导出结果到 CSV 文件。8.2 完整代码这段代码可以直接复制运行。为了让读者不受外部文件限制这里用随机方式构造数据模拟一份名为orders.csv的销售订单表。import pandas as pd import numpy as np # 1. 构造一份模拟订单数据 rng np.random.default_rng(42) n 200 df pd.DataFrame({ 订单编号: [fORD{i:04d} for i in range(1, n 1)], 城市: rng.choice([上海, 北京, 广州, 深圳], n), 商品分类: rng.choice([数码, 服装, 食品, 家居], n), 销售额: rng.choice([None, 100, 300, 500, 800, 1200], n, p[0.1, 0.2, 0.2, 0.2, 0.2, 0.1]), 订单状态: rng.choice([已支付, 待支付, 已取消], n, p[0.7, 0.2, 0.1]), 订单日期: pd.date_range(2025-01-01, periodsn, freqD) }) # 制造一些重复行 df pd.concat([df, df.iloc[:5]], ignore_indexTrue) # 2. 查看初始结构 print(数据形状:, df.shape) print(df.head()) # 3. 清洗删除缺失值、重复值转换类型 df df.dropna(subset[销售额]) df df.drop_duplicates(subset[订单编号, 城市], keepfirst) df[销售额] df[销售额].astype(float) df[订单日期] pd.to_datetime(df[订单日期]) # 4. 筛选只保留已支付订单 df_paid df[df[订单状态] 已支付] # 5. 分组聚合统计每个城市、每个分类的销售额和订单量 result df_paid.groupby([城市, 商品分类], as_indexFalse).agg( 销售额合计(销售额, sum), 订单量(订单编号, count), 平均客单价(销售额, mean) ) # 6. 排序并导出 result result.sort_values([城市, 销售额合计], ascending[True, False]) result.to_csv(result_summary.csv, indexFalse, encodingutf-8-sig) print(\n分组统计结果) print(result.head(10))8.3 代码关键逻辑解释第一模拟数据部分用np.random.default_rng生成了 200 条订单。这里特意包含了空值用于演示缺失值处理。实际工作中数据通常来自数据库导出、Excel 文件或接口但清洗逻辑是一样的。第二df pd.concat([df, df.iloc[:5]], ignore_indexTrue)故意制造了 5 条重复记录方便验证drop_duplicates是否生效。第三导出 CSV 时使用encodingutf-8-sig而不是utf-8这是为了兼容 Excel 打开中文不乱码。很多新手在这里忽略编码导致导出结果在 Excel 中乱码其实不是 Pandas 的问题而是编码选错。8.4 运行结果与预期输出运行代码后控制台会先输出数据形状: (205, 6)说明原始数据有 205 行后面清洗后行数会减少。输出分组统计结果时会看到类似下面这样的一张表城市 商品分类 销售额合计 订单量 平均客单价 0 上海 家居 29500 34 867.65 1 上海 数码 41200 40 1030.00 2 北京 服装 18200 21 866.67 ...如果你看到result_summary.csv文件成功生成并且分组字段、统计字段都正确说明整个流程已经跑通。8.5 怎么判断分析结果是否合理一个简单的方法是对比原始数据的汇总。比如先直接算所有“已支付”订单的销售额总和再对分组结果按销售额合计求和两个数字应该一样total1 df_paid[销售额].sum() total2 result[销售额合计].sum() print(total1, total2)如果两者一致说明分组汇总没有漏数据也没有重复计算。如果不一致优先检查筛选条件和重复值清洗步骤。9. 常见问题与排查思路数据分析过程中新手最容易碰到的问题其实高度集中。整理成一张表格方便你遇到问题时快速定位问题现象可能原因排查方式解决方案import pandas报 ModuleNotFoundErrorpandas 未安装或解释器不对检查当前 Python 解释器路径在正确解释器中执行pip install pandasCSV 中文乱码编码格式不一致查看文件原始编码读取时指定encodingutf-8或encodinggbkpandas 报警告 SettingWithCopyWarning对切片后的数据做原地修改检查代码中是否用了链式赋值使用.copy()复制子集或改用布尔索引直接筛选astype转换数字失败列中有逗号、百分号等非数值字符先打印该列的唯一值观察脏数据用str.replace去除特殊字符后再转换groupby 结果看起来像是“一串数字”结果是 Series没有把分组字段变成普通列查看结果类型使用reset_index()或as_indexFalse导出 Excel 中文乱码编码不是 utf-8-sig用文本编辑器打开 CSV 看原始内容导出时指定encodingutf-8-sig数据量大的时候运行很慢使用了大量循环检查是否对 DataFrame 进行迭代尽量使用向量化操作避免 for 循环每类问题都有一个核心原则先看数据结构再看代码逻辑。拿astype转换失败来说不要直接猜原因而是先运行df[销售额].unique()把列里的所有值打印出来看到脏数据再说解决方案。排查的本质是获取更多信息而不是盲改。10. 新手最容易忽略的 5 个工程细节第 1 个细节是变量命名。学习阶段用df没问题但进入真实项目后建议把变量名写成有业务含义的名称比如orders_df、paid_df、city_sales_summary。这能让代码变得可读、可维护。第 2 个细节是避免用 for 循环遍历 DataFrame。Pandas 的核心优势是向量化计算。如果发现自己写了很多for i in range(len(df))大概率是思路错了。正确的方向是“用列操作代替行循环”比如df[新列] df[销售额] * 0.9这样的一整列计算。第 3 个细节是inplaceTrue的使用争议。虽然它可以让代码看起来简洁但会让代码不容易追踪。建议统一采用df df.dropna()这种显式赋值的写法目的更明确。第 4 个细节是数据备份。洗数据之前建议先保留一份原始数据的副本raw_df df.copy()如果清洗过程出现问题还可以从原始版本重来不用重新读取文件。copy()这个调用在新建变量时有效避免切片视图带来的连锁修改问题。第 5 个细节是抽样时固定随机种子。当你需要用随机抽样快速验证代码时一定要加random_state否则每次运行结果不一样排查时非常痛苦sample_df df.sample(n100, random_state42)这些细节不直接影响入门但能帮你从“能跑”走向“跑得明白”。11. 小结与后续学习方向现在回头看Pandas 入门的核心其实就是一个流程读取数据、了解数据、清洗数据、筛选数据、分组聚合、导出结果。你不必记住 Pandas 的所有方法只要能按这个流程走一遍遇到不会的再去查就已经具备了用 Python 做基础数据分析的能力。如果你按照本文的代码练习了一遍下一步可以有四个方向继续深入。第一个是数据可视化用 Matplotlib 或 Seaborn 把分组结果画成柱状图、折线图让分析结果更直观第二个是学习 SQL把 Pandas 的 table 思维和 SQL 的表操作对比理解会加深对数据结构的认识第三个是接触更多真实数据比如公开的电商数据、招聘数据自己设定分析问题并动手实践第四个是掌握更进阶的 Pandas 操作比如merge做表连接、pivot_table做透视表、apply做自定义函数处理这些会在处理复杂数据时派上用场。最后想给所有新手一个提醒不要把 2 小时的目标定成“学会所有 Pandas 函数”那是学习几个月甚至更久的结果。2 小时最合理的产出是形成 DataFrame 的基本认知并且亲手完成一次从原始数据到分析结果的小闭环。有了这个闭环之后每学一个新函数都是在往这个流程里加工具而如果连闭环都没有学再多的函数也很难用起来。这篇教程里的代码建议复制到你的本地环境跟着敲一遍。第一次跑通可能有点卡壳但每解决一个报错你对 Pandas 的理解都会上一个台阶。后面如果再碰到“数据分析”相关的面试题或真实项目你会发现最核心的考察点仍然落在这套读、察、洗、析、出的流程上。把这些基础打牢远比追求高深复杂的技巧更重要。