简介:Pandas入门与实践课件是一套面向Python数据分析初学者的教学PPT,聚焦Pandas在数据清洗、处理与分析中的核心应用,涵盖Series、DataFrame、Index等关键数据结构及缺失值处理、数据分组、拆分合并等常用操作。课件共1个pptx文件,压缩包大小3.59MB,内容精炼、结构清晰,适合正在接触数据分析或希望系统掌握Pandas基础操作的读者。已有1257人参与学习,口碑与实用性得到初步验证。课件详细介绍了Series的五种创建方式、Index不可变特性及集合运算、Series的数组/字典式访问方法,并通过DataFrame演示实际数据处理流程,包括dropna、fillna处理缺失值,groupby实现分组聚合,concat、merge进行数据合并等,还配有大量代码示例与效果展示,可帮助读者快速上手Pandas操作Excel等常见场景,提升日常数据分析效率。
1. 为什么Pandas是数据分析的“第一块敲门砖”
我第一次接触Pandas是在处理一份几千行的销售记录时,当时还在用Excel手工筛选、VLOOKUP匹配,数据一多就卡得怀疑人生。后来换成Pandas,同样的活儿从半小时压缩到几秒钟,那一刻我真的觉得“打开新世界的大门”。Pandas这个Python库,说白了就是Python世界里的Excel Plus,但它的能力远远超出表格处理本身——无论是数据清洗、字段筛选、多表拼接、时序重采样还是数据聚合,Pandas都能用几行代码扛下来。对于一个想入门数据分析的人,Pandas基本是绕不开的第一步,也是性价比最高的一步。
这篇文章适合谁?如果你有最基础的Python语法知识,知道怎么定义变量、写个for循环,但面对一堆CSV、Excel数据不知从何下手,那这篇“Pandas入门与实践”就是为你准备的。如果你已经在用Excel做数据分析,想换工具提升效率,同样适用。全文我会按照我自己学习、讲课、实际做项目的路径来梳理:从安装环境、数据读写、数据结构、数据清洗到常见坑位排查,全是干货,不会讲虚的。
网上关于Pandas的资料非常多,但很多教程只讲API,不讲“为什么这么做”和“实际中会遇到什么坑”。这篇文章我会用大量真实项目中会遇到的场景来讲,让你学完就能直接上手干活,而不是停留在“看懂了但不会用”的状态。
2. Pandas环境搭建与安装实操
2.1 用pip安装Pandas及依赖包
pip install pandas是我在给学员上课时敲的第一条命令。安装本身并不复杂,但有几个细节值得注意。如果你用Anaconda发行版,Pandas通常已经内置,直接import pandas as pd就能用,不需要额外安装。但如果你用的是纯Python环境,或者像PyCharm这种IDE自带的解释器,那你大概率需要手动装。
最常见的方式就是在终端或命令行里执行:
pip install pandas这一步会把Pandas以及它的核心依赖——NumPy、python-dateutil、pytz等一并装上。装完之后建议顺手装一下openpyxl,为什么?因为Pandas读写Excel文件时,.xlsx格式默认依赖openpyxl引擎,不装的话read_excel('/path/file.xlsx')会直接给你抛个 ImportError。很多新手在pip install pandas之后,高高兴兴去读Excel,结果报错“Missing optional dependency 'openpyxl'”,一脸懵,其实就是漏了这一步。
pip install pandas openpyxl我建议你直接用这一条命令装全,省得后面补课。
2.2 PyCharm等IDE中安装Pandas的两种方式
在PyCharm里装Pandas,很多初学者会困惑到底在终端敲还是在IDE里面点。实际上两种都行。第一种是直接用PyCharm底部的Terminal窗口,它会自动定位到你当前项目的虚拟环境,执行上面的pip install pandas openpyxl即可。第二种是走图形界面:File -> Settings -> Project -> Python Interpreter,点右侧的“+”号,在搜索框里输入pandas,选中后点击左下角的Install Package。这种方式的好处是不用记命令,适合对命令行还不熟的朋友。
不过这里有个实操中很常见的坑:如果你在PyCharm里创建项目时选了虚拟环境(venv),而你后来又在系统Python里装了Pandas,那PyCharm项目里照样import不到。别问我怎么知道的,这个问题在答疑群里被问过不下二十次。记住一个原则:Pandas装到哪个解释器里,就只有哪个解释器能用。你需要在PyCharm右下角确认当前用的是哪个解释器,再决定在哪儿装。
验证安装是否成功,在PyCharm里新建一个Python文件,写下:
import pandas as pd print(pd.__version__)能打印出版本号就说明环境没问题了。
3. Pandas核心数据结构与基础操作
3.1 Series与DataFrame的关系
很多新手一上来就被Series和DataFrame这两个概念绕晕。我用一句话给你讲明白:Series是一维的带标签数组,DataFrame是二维的表格。DataFrame可以理解成多个Series拼在一起的结果,每一列都是一个Series,所有列共用一个行索引。
我上课时常举一个生活化的例子:把Series想象成一张单列记账单,每笔金额有一个日期标签;DataFrame就是一张完整的记账表,有日期、金额、分类、备注好几列,但不管几列,每一行仍然对应同一条记录。理解了这个关系,后面操作起来会顺畅很多。
创建DataFrame最常用的方式是传入字典:
import pandas as pd data = { '姓名': ['张三', '李四', '王五'], '城市': ['北京', '上海', '广州'], '销售额': [12000, 8500, 9300] } df = pd.DataFrame(data) print(df)输出就是一个规整的表格,行索引默认是0、1、2。这个“默认行索引”是Pandas里的基础设计,后面我们会经常用到它做定位和筛选。
3.2 为什么索引从0开始及如何自定义索引
索引是Pandas的灵魂。默认情况下DataFrame的行索引是RangeIndex,从0开始递增,类似于Python列表的下标。但实际业务中,我们经常需要更有实际含义的索引,比如按日期、按员工ID。这时候可以用set_index把某一列变成索引:
df.set_index('姓名', inplace=True)设完之后,你要查张三的记录,就不再是靠行号定位,而是直接用标签定位:df.loc['张三']。这是Pandas里最核心的定位方式之一,比记忆行号直观得多。
这里要特别提醒一下:inplace=True表示在原始DataFrame上直接修改,不返回新对象。很多人刚开始容易忽略这个参数,结果发现操作之后数据没变,其实就是因为没加inplace=True或者没有把返回值重新赋值。Pandas很多方法默认返回新对象、不改原数据,这是它的一个设计理念——默认不破坏原始数据,保证操作的安全性。但代价就是新手容易懵。我给你的建议是:初期统一用“重新赋值”的方式:
df = df.set_index('姓名')这样意图更清晰,也避免在函数调用链中因为inplace引发连锁问题。
4. 数据读写:Excel和CSV的完整链路
4.1 用Pandas读取Excel文件
read_excel是处理业务数据最高频的函数之一。语法很简单:
df = pd.read_excel('销售数据.xlsx') df.head()head()会显示前5行,这是拿到任何数据之后的第一动作——先看看数据长什么样,别急着做处理。有几个常用参数我建议你记住:
sheet_name='Sheet1':指定读取哪个工作表,可以传工作表名称,也可以传索引(从0开始)header=0:指定哪一行作为列名,默认是第一行skiprows=N:跳过前N行不读usecols='A:C'或者usecols=['姓名','销售额']:只读取指定的列,数据文件很大的时候这个参数非常管用,能大幅提升读取速度
实际场景中,我从甲方那儿拿到的Excel经常是带标题、带说明、合并单元格混着来的。真正的数据表头可能不在第一行,这时候skiprows就能派上用场。比如前两行是项目说明,第三行才是真正的列名,那就pd.read_excel('xx.xlsx', skiprows=2)。
4.2 先处理后写回:Excel导出与格式控制
数据分析不是只读不写。处理完的数据经常要分发出去,最常见的导出就是写回Excel:
df.to_excel('清洗后数据.xlsx', index=False, sheet_name='结果')index=False这个参数我要单独拿出来说。默认情况下to_excel会把行索引也写进文件,如果你没有自定义索引,那就会多出一列0、1、2、3……这在新手作品里太常见了。你拿到的数据如果多了一列“Unnamed: 0”,八成就是这个原因。所以导出时养成习惯,不需要索引就显式传index=False。
如果你想把多个DataFrame写到同一个Excel文件的不同工作表里,可以用ExcelWriter:
with pd.ExcelWriter('月度报表.xlsx') as writer: df_1月.to_excel(writer, sheet_name='1月', index=False) df_2月.to_excel(writer, sheet_name='2月', index=False)这个用法在处理月度汇总报表时特别实用,一次性生成整份工作簿,免去手工复制粘贴。
4.3 CSV读写与编码问题的处理
CSV文件的读写同样高频,但编码问题是绕不开的坑。如果你读CSV出现乱码或者UnicodeDecodeError,绝大多数情况是编码指定不对。国内常见的CSV文件默认是GBK编码,而Pandas默认用utf-8去读,于是直接报错。解决办法:
df = pd.read_csv('数据.csv', encoding='gbk')反过来,如果你处理完数据要发出去,考虑到接收方可能用什么软件打开,可以在导出时也显式指定编码。一般Windows下的Excel用gbk打开utf-8的CSV会乱码,这一点我踩过很多次坑,后来统一用encoding='utf-8-sig'导出,前面带上BOM头,Excel就能正确识别了。
df.to_csv('处理结果.csv', index=False, encoding='utf-8-sig')这是我从实战里拿到的经验,文档里不会明确告诉你,但遇到一次就会终身记住。
5. 数据清洗与预处理实战
5.1 删除行或列:drop的进阶玩法
现实数据从来没有干干净净的,缺失值、错误值、冗余列到处都是。drop就是用来做减法的。删除某几列用列名列表,删除某些行用索引:
df = df.drop(columns=['备注', '冗余字段']) df = df.drop(index=[0, 1])drop默认也是返回新对象,同样要注意重新赋值。还有一个高频需求是去重,drop_duplicates()可以按整行去重,也可以按指定列去重,比如只按“用户ID”去重,保留第一条记录:
df = df.drop_duplicates(subset=['用户ID'], keep='first')这里keep='first'的意思是保留重复组中的第一条。如果你要保留最后一条,改成keep='last'即可。
5.2 数据类型转换的细节
用Pandas读Excel、CSV最头疼的一件事:数据类型经常不是你想的那样。明明看起来是数字的列,结果dtypes一查是object(字符串);明明应该算日期,Pandas却当成普通字符串。所以拿到数据后先看类型是铁律:
print(df.dtypes)接着按需转换。最常见的三件套:
- 字符串转数值:
pd.to_numeric(df['销售额'], errors='coerce') - 字符串转日期:
pd.to_datetime(df['日期'], format='%Y-%m-%d') - 数值转字符串:
df['列名'].astype(str)
我来解释一下errors='coerce'的作用:数据里混入了“未知”或者“-”这类非数字内容时,直接转数值会报错;加了这个参数后,无法转换的位置会变成NaN(缺失值),不会中断程序,你后面再统一处理缺失值就行。这是处理真实脏数据时必备的一招。
日期转换里,format参数我建议你养成显式指定的习惯。虽然Pandas有自动推断日期的功能,但面对不规范的日期格式,比如“2024/1/5”“20240105”“2024-01-05 08:30:00”混在一起的情况,显式指定格式能减少很多莫名其妙的解析错误。
5.3 缺失值处理与数据预览
拿到脏数据,先看整体健康度:
print(df.isnull().sum())这个操作会告诉你每一列有多少缺失值。缺失值的处理策略取决于业务场景。如果缺失行占比很小,直接删掉:
df = df.dropna()如果有业务含义的列缺失严重,比如“客户评分”缺了80%,建议整列删除。但对于数值型的关键列,比如“销售额”,缺失了个别值,更适合用填充的方式:
df['销售额'] = df['销售额'].fillna(df['销售额'].mean())用均值填充是最常用的方案。但你要理解这样做的副作用——它会让该列的方差变小,如果后续做统计分析,会略微影响结果。所以更精细的做法是按分组填充,比如按城市分组后,用每个城市的平均销售额去补缺失值:
df['销售额'] = df.groupby('城市')['销售额'].transform(lambda x: x.fillna(x.mean()))这个逻辑很符合业务直觉:北京的缺失值用北京的平均水平去补,而不是拿全国平均去凑。在真实项目里,这种处理方式往往更能说服业务方。
6. 数据筛选、排序与分组统计
6.1 基于条件的数据筛选
数据分析的一半工作就是筛选——找出你想要的那部分数据。Pandas筛选的核心是布尔索引。比如找出销售额大于10000的记录:
high_sales = df[df['销售额'] > 10000]这里df['销售额'] > 10000生成一个布尔序列,df[...]只保留对应位置为True的行。多个条件组合时,用&表示与、|表示或、~表示非,每个条件都要用括号括起来:
df[(df['销售额'] > 10000) & (df['城市'] == '北京')]新手最容易忘记括号,导致报错“The truth value of a Series is ambiguous”。这个报错我见了太多次了,原因就是Python会把这一整段判断当成布尔值去判断,但实际上它应该是一个逐元素判断的序列。加上括号各归各位,就好理解也更好用了。
6.2 排序与排名操作
排序用的是sort_values,同样默认返回新对象:
df = df.sort_values('销售额', ascending=False)ascending=False表示降序,也就是按销售额从高到低排。多列排序也是常见需求,比如先按城市排、再按销售额排:
df = df.sort_values(['城市', '销售额'], ascending=[True, False])这里两个排序规则一一对应:城市升序,同城市内销售额降序。
6.3 groupby分组统计的常用套路
分组统计是Pandas所有功能里我认为最值钱的。它是Excel透视表的Python版本,但更灵活。核心用法就一行:
df.groupby('城市')['销售额'].agg(['sum', 'mean', 'count', 'max', 'min'])这句话的意思是:按“城市”分组,每组统计销售总额、平均值、记录条数、最大值、最小值。agg里可以传入一个列表,同时算多个指标,非常爽。我用它处理过几万行订单数据,按“区域+产品类别”两层分组,组合统计十来个指标,也就几毫秒的事,这份效率在Excel里完全不敢想象。
如果你要分组后分别做不同的事情,groupby配合apply或transform更强大。比如前面提到的分组均值填充,就是一个典型应用。还有一个常见场景:找出每个城市销售额最高的一条记录:
df.loc[df.groupby('城市')['销售额'].idxmax()]idxmax()返回每个分组中最大值对应的索引,再用loc定位到这些行。这个技巧在业务分析中出镜率非常高,记住它。
6.4 数据透视表快速上手
除了groupby,pivot_table也是高频工具,尤其是做报表的人。比如你想看“不同城市、不同月份的销售额汇总”:
import numpy as np pivot = pd.pivot_table(df, values='销售额', index='城市', columns='月份', aggfunc=np.sum, fill_value=0)行是城市、列是月份,交叉点是销售额汇总,fill_value=0把没有数据的格子填成0。这个结果导出到Excel,基本上就是老板最爱看的报表形态了。aggfunc默认是np.mean,你可以换成np.sum、np.count等,按需选择。
7. 常见报错与实战排查技巧
7.1 五个高频报错的解决方法
我把自己讲课和答疑中遇到的Pandas高频报错整理了一下,每个新手基本都会碰到至少两三个。
第一个是ModuleNotFoundError: No module named 'pandas'。原因就一个:当前解释器环境里没装Pandas。解决方式就是回到本文第二章节,确认解释器,执行pip install pandas openpyxl。
第二个是Missing optional dependency 'openpyxl'。读Excel时最容易触发。解决方式:pip install openpyxl。
第三个是UnicodeDecodeError。前面讲过,读CSV时编码不匹配,改为encoding='gbk',或者先查文件是什么编码再对症下药。
第四个是The truth value of a Series is ambiguous。多条件筛选时没加括号。解决方式就是条件表达式全部用括号包裹,然后使用&或|。
第五个是KeyError。一般是你用了一个不存在的列名。建议先跑一下df.columns确认列名,尤其是Excel文件里列名带了空格或不可见字符的情况。
7.2 实战中的数据排查技巧
拿到一个新数据集,不管是什么格式,我的习惯是固定跑五个操作:df.head()看前几行、df.info()看数据类型和缺失概况、df.describe()看数值列的统计分布、df.isnull().sum()看每列缺失量、df.duplicated().sum()看重复行数。这五步10秒钟内完成,你对数据的整体认知就建立起来了。
df.info()是特别容易被忽略但特别有用的一个方法。它会把每一列的名称、非空数量、数据类型全部以紧凑的表格列出来,一眼扫过去就知道哪些列有缺失、哪些列类型不对。我见过很多同学处理数据半天,结果发现是某个日期列被读成了object类型,后面所有时间相关的操作全部失灵。如果一开始先info()一下,这个坑就根本不会踩到。
8. 一步步做一个小项目:订单数据清洗与汇总
学完上面这些内容,我建议你找一个真实的数据集把整套流程走一遍。拿订单数据举例,完整的处理链路长这样:读数据 -> 看结构 -> 清洗缺失 -> 修正类型 -> 筛选有效记录 -> 分组汇总 -> 导出报表。
第一步,读入数据并快速体检:
import pandas as pd df = pd.read_excel('订单数据.xlsx', sheet_name='明细') print(df.info()) print(df.head())第二步,处理缺失值。删除“订单编号”缺失的行,它没有业务意义;再用城市均值填充“销售额”缺失值。
df = df.dropna(subset=['订单编号']) df['销售额'] = df.groupby('城市')['销售额'].transform(lambda x: x.fillna(x.mean()))第三步,类型修正。把“订单日期”转成datetime类型,把“销售额”强制转为数值,无法转换的置为NaN:
df['订单日期'] = pd.to_datetime(df['订单日期'], errors='coerce') df['销售额'] = pd.to_numeric(df['销售额'], errors='coerce')第四步,新增一列“月份”方便后续按月统计:
df['月份'] = df['订单日期'].dt.to_period('M')这里dt访问器是Pandas专门用于datetime列的一个入口,后面可以接year、month、to_period等属性或方法。这一行代码就能从日期里掏出“月份”这个维度。
第五步,汇总并导出:
report = pd.pivot_table(df, values='销售额', index='城市', columns='月份', aggfunc='sum', fill_value=0) report.to_excel('月度城市销售报表.xlsx', index=True)到这里,一份标准的“城市x月度”销售汇总报表就出来了,全程不过二十来行代码。如果你不信任自己的数据,可以在中间任何一步加上print(df.head())去看过程结果。我在实际项目中就是这么干的,每处理完一个步骤都瞄一眼长什么样,确认没问题再进入下一步。
这个流程你走通了,Pandas的基础就算真正扎稳了。
最后分享一点个人经验:Pandas不需要背函数,背了也会忘,关键是理解数据结构、理解索引和布尔筛选这些核心机制。用的时候查文档、查资料都很正常,但思考的逻辑、操作的路径,是得靠多做项目才能内化成自己的东西。我每次拿到一套新数据,依然会规规矩矩地info()、head()、isnull().sum()走一遍,不是我不会别的方法,而是这套流程帮我避开了太多数据上的暗坑。希望你也能把这种“先体检再处理”的习惯融进自己的分析流程里。
本文还有配套的精品资源,点击获取