首页/新闻资讯/正文详情

Pandas数据分析入门:Series与DataFrame核心操作详解

发布时间:2026/9/26 19:04:26 来源:云帆数科 栏目:资讯中心
Pandas数据分析入门:Series与DataFrame核心操作详解
1. 为什么数据分析绕不开Pandas刚接触Python数据分析那会儿我最先装的是NumPy。数组运算确实快但一到处理带标签的表格数据就浑身难受——想按列名取数得自己记索引想按条件筛选得写一堆布尔运算缺失值处理更是要手动循环。直到用上Pandas才真正体会到什么叫“为表格数据而生”。Pandas是Python生态里做数据分析最核心的库没有之一。它建立在NumPy之上但把NumPy那种“面向数组”的思维升级成了“面向表格”的思维。你可以把它理解成Python里的Excel但能力远超Excel——处理百万行数据毫无压力支持复杂的行列索引、分组聚合、时间序列、缺失值处理还能直接读写Excel、CSV、JSON、SQL等十几种数据源。这篇文章适合谁看如果你刚开始学Python数据分析或者从Excel转过来想用代码处理数据又或者已经用过Pandas但总觉得“会用但没系统搞明白”那这篇内容就是写给你的。我会从Pandas最核心的两个数据结构讲起把创建、索引、筛选、类型转换这些基础操作掰开揉碎配上我实际踩过的坑和总结的技巧。看完之后你至少能做到拿到一份Excel或CSV文件知道怎么读进来、怎么看数据长什么样、怎么按条件筛选、怎么处理缺失值、怎么把结果导出去。Pandas的官方文档写得很全但全不等于好用。很多新手打开官方文档就懵了——参数太多示例太散不知道从哪下手。我这篇就按“实际干活需要什么”的顺序来组织不追求面面俱到但求每个讲到的点都能直接上手用。2. 两个核心数据结构Series和DataFrame2.1 Series带标签的一维数组Series是Pandas里最基础的数据结构你可以把它想成“带索引的一列数据”。普通列表只有位置Series每个元素都有一个标签索引这样你就能用标签来取值而不是只能靠位置。创建一个Series很简单import pandas as pd s pd.Series([10, 20, 30, 40], index[a, b, c, d]) print(s)输出是a 10 b 20 c 30 d 40 dtype: int64左边是索引右边是值。如果不指定indexPandas会自动生成0到n-1的整数索引。Series的索引不要求唯一也不要求有序这给了很大的灵活性。Series有两个核心属性需要记住values返回底层的NumPy数组index返回索引对象。实际用的时候s.values和s.index能帮你快速看清数据长什么样。注意Series的索引可以是字符串、整数、时间戳甚至混合类型。但混合类型索引在筛选时容易出问题建议保持索引类型一致。2.2 DataFrame带行列标签的二维表格DataFrame才是Pandas真正的主角。它是一个二维表格有行索引和列名每一列可以有不同的数据类型。你可以把它理解成“多个Series拼在一起共享同一个行索引”。创建DataFrame最常见的方式是用字典data { 姓名: [张三, 李四, 王五, 赵六], 年龄: [25, 30, 28, 35], 城市: [北京, 上海, 广州, 深圳], 薪资: [15000, 20000, 18000, 25000] } df pd.DataFrame(data) print(df)输出姓名 年龄 城市 薪资 0 张三 25 北京 15000 1 李四 30 上海 20000 2 王五 28 广州 18000 3 赵六 35 深圳 25000左边那列0、1、2、3是自动生成的行索引。列的顺序默认按字典键的插入顺序Python 3.7之后字典有序所以列顺序是稳定的。DataFrame的shape属性返回(行数, 列数)columns返回列名索引dtypes返回每列的数据类型。这三个属性是我拿到任何新数据后最先看的——先知道数据多大、有哪些列、每列什么类型再决定下一步怎么处理。2.3 从外部文件创建DataFrame实际工作中数据很少是手敲进去的大部分时候是从Excel或CSV读进来的。读CSVdf pd.read_csv(data.csv, encodingutf-8)读Exceldf pd.read_excel(data.xlsx, sheet_nameSheet1)这两个函数参数很多但新手只需要关注几个关键的参数作用常用值encoding文件编码utf-8、gbkheader表头行号0默认第一行、None无表头names自定义列名列表usecols只读某些列列名列表或索引列表nrows只读前n行整数中文CSV文件经常遇到编码问题。Windows上Excel导出的CSV默认是gbk编码用utf-8读会报错。我的经验是先试utf-8报错就换gbk再不行用chardet库检测编码。实操心得读大文件时先用nrows100读前100行看看结构确认列名和数据类型没问题再全量读。直接读几个G的文件容易把内存撑爆。3. 数据查看与索引操作3.1 快速了解数据全貌拿到DataFrame后别急着分析先花30秒把数据摸清楚。我习惯按这个顺序来df.head() # 看前5行 df.tail() # 看后5行 df.info() # 看每列类型和非空值数量 df.describe() # 看数值列的统计摘要 df.shape # 看行列数info()特别有用它会告诉你每列有多少非空值。如果某列非空值数量明显少于总行数说明有缺失值后面要处理。describe()默认只统计数值列输出count、mean、std、min、25%、50%、75%、max。如果想让类别列也参与统计加参数includeall。3.2 列操作选取、新增、删除选一列df[姓名] # 返回Series df[[姓名, 年龄]] # 返回DataFrame注意单方括号和双方括号的区别单方括号选一列返回Series双方括号选多列返回DataFrame。这个区别在后续操作中很重要因为Series和DataFrame支持的方法不完全一样。新增一列df[年薪] df[薪资] * 12删除列df.drop(年薪, axis1, inplaceTrue)axis1表示操作列axis0表示操作行。inplaceTrue表示直接在原DataFrame上修改不返回新对象。我个人的习惯是不用inplace而是重新赋值df df.drop(年薪, axis1)。这样代码更清晰也避免链式操作时的警告。3.3 行操作loc和iloc这是Pandas新手最容易混淆的地方。记住一句话loc用标签iloc用位置。df.loc[0] # 取索引为0的行 df.iloc[0] # 取第1行位置0 df.loc[0:2] # 取索引0到2的行包含2 df.iloc[0:2] # 取位置0到1的行不包含2loc的切片是闭区间iloc的切片是左闭右开——这和Python列表切片一致但和loc不一致容易搞混。同时选行列df.loc[0:2, [姓名, 年龄]] # 前3行的姓名和年龄列 df.iloc[0:2, 0:2] # 前2行前2列常见坑如果DataFrame的索引不是默认整数索引比如是字符串索引那df[0]会报错必须用df.loc[标签]或df.iloc[0]。我建议养成习惯取行一律用loc或iloc不用方括号。3.4 布尔索引按条件筛选这是Pandas最强大的功能之一。比如筛选年龄大于28的人df[df[年龄] 28]多个条件用与、|或每个条件必须用括号包起来df[(df[年龄] 28) (df[城市] 北京)]为什么必须加括号因为Python中的优先级比高不加括号会先算再算比较结果完全不对。这个坑我踩过不止一次。筛选某列值在某个列表中df[df[城市].isin([北京, 上海])]筛选某列值不在列表中前面加~df[~df[城市].isin([北京, 上海])]3.5 设置和重置索引有时候需要把某一列设为索引比如用日期做索引方便按时间筛选df.set_index(日期, inplaceTrue)想恢复默认整数索引df.reset_index(inplaceTrue)如果原来的索引有名字reset后会变成一列。如果不想保留原索引加dropTrue。4. 数据类型转换与缺失值处理4.1 查看和转换数据类型df.dtypes能看到每列的类型。常见类型有int64、float64、object通常是字符串、datetime64、bool。转换类型用astype()df[年龄] df[年龄].astype(int32) df[薪资] df[薪资].astype(float64)字符串转数字要小心。如果字符串里有非数字字符astype会报错。这时候用pd.to_numeric()加参数errorscoerce把无法转换的变成NaNdf[薪资] pd.to_numeric(df[薪资], errorscoerce)日期转换用pd.to_datetime()df[日期] pd.to_datetime(df[日期], format%Y-%m-%d)不指定format也行Pandas会自动推断但数据量大时指定format能快很多。4.2 缺失值检测与处理检测缺失值df.isnull() # 返回布尔DataFrame df.isnull().sum() # 每列缺失值数量 df.isnull().sum().sum() # 总缺失值数量处理缺失值有几种策略删除缺失值df.dropna() # 删除任何有缺失值的行 df.dropna(subset[薪资]) # 只删除薪资列有缺失的行 df.dropna(howall) # 只删除全为空的行填充缺失值df.fillna(0) # 用0填充 df[薪资].fillna(df[薪资].mean()) # 用均值填充 df[城市].fillna(未知) # 用固定值填充向前填充和向后填充df.fillna(methodffill) # 用前一个值填充 df.fillna(methodbfill) # 用后一个值填充实操心得填充缺失值没有万能方案。数值列用均值或中位数类别列用众数或“未知”时间序列用前向填充。关键是填充后要检查分布有没有被扭曲。我一般会对比填充前后describe()的结果如果均值变化超过5%就要重新考虑填充策略。4.3 重复值处理检测重复行df.duplicated() # 返回布尔Series df.duplicated().sum() # 重复行数量删除重复行df.drop_duplicates() # 完全重复的行 df.drop_duplicates(subset[姓名]) # 姓名列重复的行 df.drop_duplicates(subset[姓名], keeplast) # 保留最后一条keep参数默认是first保留第一条last保留最后一条False则全部删除。5. 数据排序、分组与聚合5.1 排序按某一列排序df.sort_values(薪资, ascendingFalse)按多列排序df.sort_values([城市, 薪资], ascending[True, False])按索引排序df.sort_index()排序后索引会跟着数据走如果想让索引重新从0开始加ignore_indexTrue。5.2 分组聚合这是Pandas最核心的分析功能。按城市分组算平均薪资df.groupby(城市)[薪资].mean()按城市分组算多个统计量df.groupby(城市)[薪资].agg([mean, max, min, count])对不同列做不同聚合df.groupby(城市).agg({ 薪资: [mean, max], 年龄: mean })groupby的结果是一个GroupBy对象不直接显示数据需要接一个聚合函数才会出结果。常用的聚合函数有mean、sum、count、max、min、std、median、nunique。5.3 数据透视表Pandas的pivot_table和Excel的数据透视表功能类似pd.pivot_table(df, values薪资, index城市, columns性别, aggfuncmean)这个功能在交叉分析时特别有用比如想看不同城市不同性别的平均薪资一行代码就出来了。6. 文件读写与导出6.1 读Excel的常见问题pd.read_excel()依赖openpyxl库读xlsx或xlrd库读xls。如果报错说缺少引擎装一下就行pip install openpyxl读多个sheetxls pd.ExcelFile(data.xlsx) print(xls.sheet_names) # 查看所有sheet名 df pd.read_excel(xls, sheet_nameSheet2)6.2 写Excel和CSV导出CSVdf.to_csv(output.csv, indexFalse, encodingutf-8-sig)indexFalse表示不写行索引。encodingutf-8-sig带BOM头用Excel打开不会乱码。如果对方用WPS或老版本Excel用gbk编码更稳。导出Exceldf.to_excel(output.xlsx, indexFalse, sheet_name结果)导出多个sheetwith pd.ExcelWriter(output.xlsx) as writer: df1.to_excel(writer, sheet_nameSheet1, indexFalse) df2.to_excel(writer, sheet_nameSheet2, indexFalse)注意写Excel时如果文件被其他程序占用会报PermissionError。确保目标文件没有被Excel打开。7. 常见问题与排查技巧7.1 SettingWithCopyWarning警告这个警告几乎每个Pandas用户都遇到过。原因是Pandas无法确定你是在操作原DataFrame的视图还是副本。比如df[df[年龄] 28][薪资] 30000 # 会触发警告且可能不生效正确做法是用locdf.loc[df[年龄] 28, 薪资] 30000或者先复制一份subset df[df[年龄] 28].copy() subset[薪资] 300007.2 中文列名和路径问题中文列名本身没问题但在某些操作中容易因为编码问题出错。我的建议是如果数据要长期维护列名用英文如果只是临时分析中文列名更方便阅读。文件路径含中文时Windows上一般没问题Linux上要注意编码。用pathlib处理路径更稳from pathlib import Path file_path Path(数据) / 销售数据.xlsx df pd.read_excel(file_path)7.3 内存不足处理大文件时内存不够可以分块读chunks pd.read_csv(big_file.csv, chunksize100000) for chunk in chunks: process(chunk)或者只读需要的列df pd.read_csv(big_file.csv, usecols[姓名, 薪资])还可以指定更小的数据类型df pd.read_csv(big_file.csv, dtype{年龄: int32, 薪资: float32})7.4 常见问题速查表问题原因解决方法读CSV乱码编码不匹配换encoding参数试utf-8、gbk、utf-8-sig读Excel报错缺少引擎pip install openpyxl筛选结果为空条件类型不匹配检查列类型字符串和数字不能直接比较分组后列消失分组列变成了索引加as_indexFalse或reset_index()排序后索引乱索引跟着数据走加ignore_indexTrue填充缺失值不生效用了inplace但没接收返回值重新赋值或加inplaceTrue8. 我踩过的坑和总结的技巧第一个坑是链式索引。刚开始用Pandas时我总喜欢写df[df[A] 1][B] 2这种链式操作结果要么报警告要么改了没效果。后来养成习惯只要涉及修改一律用df.loc[条件, 列名] 值。第二个坑是数据类型。从Excel读进来的数字列如果某一行有个“暂无”之类的文本整列会变成object类型。这时候做数值计算就会报错。我的做法是读完数据先df.info()看一眼发现类型不对就用pd.to_numeric(errorscoerce)转把无法转换的变成NaN再处理。第三个坑是索引对齐。两个DataFrame做运算时Pandas会自动按索引对齐索引不匹配的位置会变成NaN。这个特性有时候很有用但如果不注意就会得到一堆NaN。解决办法是运算前先reset_index()或者确认两边索引一致。第四个坑是inplace参数。早期版本很多函数支持inplaceTrue但新版本逐渐在弱化这个参数。我现在基本不用inplace而是重新赋值代码更清晰也不容易出错。最后分享一个提高效率的技巧把常用的数据探查代码封装成一个函数每次拿到新数据先跑一遍。比如def explore(df): print(f形状: {df.shape}) print(f列名: {df.columns.tolist()}) print(f类型:\n{df.dtypes}) print(f缺失值:\n{df.isnull().sum()}) print(f重复行: {df.duplicated().sum()}) print(df.head())这个函数帮我省了大量重复敲代码的时间也避免了遗漏检查项。Pandas的内容很多但核心就是这些数据结构、索引、筛选、类型转换、缺失值、分组聚合、文件读写。把这些练熟日常数据分析任务基本都能应付。后面再学合并、时间序列、窗口函数这些进阶内容就有了扎实的基础。

相关推荐

WesCode编辑器实测:从安装配置到团队落地的完整指南
WesCode编辑器实测:从安装配置到团队落地的完整指南

最近组里在传一个新编辑器 WesCode,说有同事把配置同步到公司内网后,处理一个中型 Go 服务时索引速度和补全响应明显快了不少。我一开始觉得又是“下一代编辑器”的常规炒作,直到自己跑了一遍才改变看法。WesCode 是一款面向本地开发场景的跨… · 2026/9/26 19:04:26

MySQLTuner-perl 质量保障与测试体系深度解析:静态合规审计、实验室集成测试与 GitHub Actions CI/CD
MySQLTuner-perl 质量保障与测试体系深度解析:静态合规审计、实验室集成测试与 GitHub Actions CI/CD

数据库运维 【免费下载链接】MySQLTuner-perl MySQLTuner is a script written in Perl that will assist you with your MySQL configuration and make recommendations for increased performance and stability. 项目地址: https://gitcode.com/gh_mirrors/my/My… · 2026/9/26 19:04:20

从200美元到18美元:中国团队如何用TaoToken重构AI编程栈成本
从200美元到18美元:中国团队如何用TaoToken重构AI编程栈成本

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:04:20

Gamdl工具详解:合规获取Apple Music无DRM音频元数据与AAC下载
Gamdl工具详解:合规获取Apple Music无DRM音频元数据与AAC下载

1. 项目概述:这不是“破解”,而是一次对 Apple Music 元数据生态的合规性探索Gamdl 这个名字乍一听像某个小众工具,但如果你在 GitHub 或技术社区里搜过它,会发现它其实是一个用 Python 写的命令行工具,核心目标很明确… · 2026/9/26 19:38:17

AIUEBridge 实战:用自研 UE 插件 + MCP 服务打通虚幻编辑器 AI 协同开发
AIUEBridge 实战:用自研 UE 插件 + MCP 服务打通虚幻编辑器 AI 协同开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:37:33

MiniMax M2.1 首发评测:祖传屎山代码重构实战,这种爽感谁用谁懂
MiniMax M2.1 首发评测:祖传屎山代码重构实战,这种爽感谁用谁懂

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:37:27

开启新纪元:让牛马(NB的AI工具)——Aipy帮你干活,TaoToken统一Key接入配置指南
开启新纪元:让牛马(NB的AI工具)——Aipy帮你干活,TaoToken统一Key接入配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:37:27

Eclipse Mosquitto 公共测试服务器 test.mosquitto.org 证书更新:CA 与客户端证书轮换的影响及应对指南
Eclipse Mosquitto 公共测试服务器 test.mosquitto.org 证书更新:CA 与客户端证书轮换的影响及应对指南

物联网消息队列后端网络/通信 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mo/mosquitto 点击查看 免费下载 2020 年 6 月,运行于 test.mosquitto.org 的公共 MQTT 测试 Brok… · 2026/9/26 19:37:21

LLM 工程实践:从 LLM 到 RAG、Agent、MCP 的一体化配置与验证
LLM 工程实践:从 LLM 到 RAG、Agent、MCP 的一体化配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:37:21

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码