当前位置: 首页 > news >正文

Pandas:构建 Series

在使用 Pandas 处理数据时,Series 是最基础、最核心的数据结构之一。很多初学者接触 Pandas 时,往往会先看到 DataFrame,因为它更像一张完整的表;但从结构上看,Series 才是 Pandas 中更基本的构件。可以说,DataFrame 的每一列,通常都可以表示为一个 Series。

因此,学习 Series 的关键,不只是会写 pd.Series(...),更重要的是理解:Pandas 如何把一组数据组织成“值 + 索引标签”的一维结构。只有把这一点理解清楚,后续的索引、对齐、缺失值处理、数据运算和 DataFrame 的构造方式,才会真正连贯起来。

一、什么是 Series

Series 是 Pandas 提供的一维带标签数组(One-dimensional labeled array)。

可以将它理解为一列带有索引标签的数据。它既像“一维数组”,又像“有序映射”,因为它不仅保存数据值,还保存每个值对应的标签。

例如,一组学生数学成绩可以表示为:

index

value

张三

88

李四

76

王五

91

在 Pandas 中,这样的一组数据就很适合用 Series 表示。

1、Series 的两个核心特征

(1)一维结构

Series 只沿一个维度组织数据:

• 每个位置存放一个值

• 整体构成一列数据

因此,Series 可以看作“单列数据对象”。

(2)标签化

Series 的每个值都可以有一个对应的索引标签,这些标签由 index 管理。

这意味着 Pandas 对 Series 的很多操作,并不只是按位置进行,还可以按标签进行选择、对齐和计算。

2、Series 与列表、字典、NumPy 数组的区别

从表面上看,Series 与 Python 列表、字典、NumPy 一维数组都有相似之处,但它并不等同于它们。

• 与列表相比,Series 多了索引标签

• 与字典相比,Series 不仅具有标签,还支持更方便的数值计算、缺失值处理以及基于索引的对齐操作

• 与 NumPy 一维数组相比,Series 多了标签与自动对齐机制

因此,Series 不是简单的“列表增强版”或“字典改写版”,而是 Pandas 为数据分析设计的一维带标签对象。

3、Series 的基本构造语法

构建 Series 最常见的方式是:

pd.Series(data=None, index=None, dtype=None, name=None, copy=None)

参数说明:

• data:输入数据,可以是列表、元组、字典、标量、NumPy 数组等

• index:索引标签

• dtype:指定数据类型

• name:Series 的名称

• copy:是否复制数据

4、构建 Series 的本质

构建 Series 时,本质上是在同时确定两部分内容:

• 数据值

• 索引标签 index

也就是说,Series 并不只是“一串值”,而是“值 + 标签”的统一结构。

因此,在构建 Series 时,通常要思考:

• 原始数据本身是否已经带有标签

• 标签应来自哪里

• 若没有显式标签,是否使用默认整数索引

• 当标签不齐时,是按位置理解,还是按标签对齐

这些问题决定了后续 Series 的访问方式与计算行为。

二、由列表构建 Series

列表是构建 Series 最直观的方式之一。此时,Pandas 会把列表中的元素看作一组一维数据。

1、使用默认索引

示例:

import pandas as pd s = pd.Series([88, 76, 91])print(s)

输出:

0 881 762 91dtype: int64

这里的 88、76、91 是数据值,0、1、2 是 Pandas 自动生成的默认整数索引。

这说明:即使不显式指定 index,Series 仍然总是带有索引。

2、指定索引标签

构建时也可以通过 index 显式指定标签。

s = pd.Series([88, 76, 91], index=["张三", "李四", "王五"])print(s)

输出:

张三 88李四 76王五 91dtype: int64

此时,这个 Series 就不再只是“第 0 个、第 1 个、第 2 个值”,而是“张三、李四、王五对应的值”。

这也是 Series 与普通列表的关键区别之一:它不仅有顺序,还有标签。

如果显式提供 index,那么索引长度必须与数据长度一致。

三、由字典构建 Series

字典也是构建 Series 的常见方式。与列表方式相比,字典方式更直接地体现了“标签—值”关系。

1、由普通字典构建

示例:

import pandas as pd s = pd.Series({ "张三": 88, "李四": 76, "王五": 91}) print(s)

输出:

张三 88李四 76王五 91dtype: int64

这里,字典的键自动成为索引标签,字典的值成为 Series 的数据值。

因此,字典方式天然适合表示“某个标签对应某个值”的数据。

2、指定 index 改变标签顺序

即使输入是字典,也可以通过 index 指定索引顺序。

data = { "张三": 88, "李四": 76, "王五": 91} s = pd.Series(data, index=["王五", "张三", "李四"])print(s)

输出:

王五 91张三 88李四 76dtype: int64

这说明,当输入是字典时,index 不仅可以筛选标签,还可以调整顺序。

3、指定不存在的标签

若 index 中包含字典中不存在的键,Pandas 会补缺失值 NaN。

data = { "张三": 88, "李四": 76} s = pd.Series(data, index=["张三", "李四", "王五"])print(s)

输出:

张三 88.0李四 76.0王五 NaNdtype: float64

这里 "王五" 原本不存在,因此 Pandas 自动补为 NaN。

这体现了 Pandas 的重要特点:它强调标签结构的完整性。即使某个标签暂时没有对应的数据,也可以先把结构建立起来。

4、字典中多余的键会被忽略

如果显式给出的 index 少于字典实际包含的键,那么未出现在 index 中的键会被忽略。

data = { "张三": 88, "李四": 76, "王五": 91} s = pd.Series(data, index=["张三", "李四"])print(s)

输出:

张三 88李四 76dtype: int64

因此,对字典输入而言,index 的作用不仅是排序,还可以视为“按标签取子集”。

四、由标量构建 Series

Series 也可以由一个标量构建。但此时必须显式提供索引,否则 Pandas 无法知道要生成多长的序列。

1、标量 + 指定索引

示例:

import pandas as pd s = pd.Series(100, index=["语文", "数学", "英语"])print(s)

输出:

语文 100数学 100英语 100dtype: int64

这里的 100 会被广播到所有索引位置。

这说明:当输入是标量时,Pandas 会根据 index 的长度,自动把同一个值复制到每个标签上。

这种方式适合:

• 初始化一组相同初值

• 先建立标签结构,再统一填入默认值

• 构造占位数据

例如,初始化所有科目的默认满分:

s = pd.Series(100, index=["语文", "数学", "英语", "物理"])

五、由 NumPy 数组构建 Series

在科学计算中,很多原始数据先以 NumPy 数组形式存在,此时也可以直接构建 Series。

1、由一维数组构建

示例:

import pandas as pdimport numpy as np arr = np.array([88, 76, 91])s = pd.Series(arr) print(s)

输出:

0 881 762 91dtype: int64

2、配合 index 使用

示例:

arr = np.array([88, 76, 91]) s = pd.Series(arr, index=["张三", "李四", "王五"])print(s)

输出:

张三 88李四 76王五 91dtype: int64

NumPy 数组本质上强调按位置组织数据,而 Series 则在此基础上增加了标签。

因此,由 NumPy 数组构建 Series 时,通常要特别关注两点:

• 是否需要补充索引标签

• 原数组的 dtype 是否符合预期

例如:

arr = np.array([88, 76, 91], dtype=float)s = pd.Series(arr)print(s)

输出的数据类型也会相应体现为浮点型。

这说明:若原始 NumPy 数组已经确定了数据类型,那么这种类型信息通常会带入 Series。

六、由已有 Series 再构建 Series

有时也会基于已有的 Series 再构建新的 Series。

import pandas as pd s1 = pd.Series([88, 76, 91], index=["张三", "李四", "王五"])s2 = pd.Series(s1)print(s2)

表面上看,这样写似乎没有变化,但它在重新组织索引、调整 dtype、设置 name 等场景中仍有意义;至于底层数据是否复制,还与具体参数设置有关。

例如,重新指定索引:

s1 = pd.Series([88, 76, 91], index=["张三", "李四", "王五"])s2 = pd.Series(s1, index=["王五", "张三", "赵六"])print(s2)

输出:

王五 91.0张三 88.0赵六 NaNdtype: float64

这说明:当输入本身已经是 Series 时,重新构造依然会遵循标签对齐规则,而不是简单按位置复制。

七、Series 的名称与数据类型

在构建 Series 时,除了值和索引之外,name 和 dtype 也很重要。

1、name 参数

name 用于给整个 Series 命名。

import pandas as pd s = pd.Series([88, 76, 91], index=["张三", "李四", "王五"], name="数学成绩")print(s)

输出:

张三 88李四 76王五 91Name: 数学成绩, dtype: int64

name 在以下场景中尤其有用:

• 结果展示更清晰

• 后续转换为 DataFrame 时可直接作为列标签名

• 分组、聚合后结果更易理解

例如:

df = s.to_frame()print(df)

输出:

数学成绩张三 88李四 76王五 91

2、dtype 参数

dtype 用于指定 Series 的数据类型。

s = pd.Series([88, 76, 91], dtype="float64")print(s)

输出:

0 88.01 76.02 91.0dtype: float64

在实际使用中,显式指定 dtype 有助于:

• 保证数据类型符合预期

• 避免隐式类型转换带来的歧义

• 为后续数值计算、缺失值处理和类型检查打下基础

八、常见构建错误与原因分析

1、数据长度与索引长度不一致

例如:

pd.Series([88, 76, 91], index=["张三", "李四"])

这会报错,因为数据有 3 个值,而索引只有 2 个标签。

一个 Series 中,每个值都必须对应一个索引。

2、误以为不写 index 就“没有索引”

例如:

s = pd.Series([88, 76, 91])print(s)

有些初学者会以为这“没有索引”。其实并不是。Pandas 只是自动生成了默认整数索引 0、1、2。

也就是说:Series 总是有索引,只是索引可能是默认的。

3、混淆“位置”与“标签”

例如:

s = pd.Series([88, 76, 91], index=["张三", "李四", "王五"])

此时,"张三" 是标签,不是“第 0 个位置”本身。虽然两者常常可以对应起来,但它们在概念上并不相同。

理解 Series 时,应逐渐建立这样的意识:

• 位置是顺序概念

• 标签是语义概念

在 Pandas 中,位置与标签都重要,但其很多核心行为——尤其是对齐、重建索引和缺失值处理——都与标签密切相关。

4、忽视缺失值的产生

当由字典或已有 Series 构建,并且显式使用了新的 index 时,常常会因为标签不齐而产生 NaN。

这通常不是错误,而是 Pandas 为保持标签结构完整所做的正常处理。

九、构建 Series 的实践建议

在实际使用中,构建 Series 时通常可以遵循以下几个原则。

1、优先选择最贴合原始数据结构的输入方式

不要为了统一写法而强行转换数据形式。应顺着原始数据本身的组织方式来选择构建方法:

• 已有顺序值序列,用列表或数组

• 已有“标签—值”映射,用字典

• 需要统一初值,用“标量 + index”

• 已带标签的数据,用已有 Series

2、尽早明确索引

索引不是装饰品,而是 Series 的结构组成部分。它会直接影响:

• 选取方式

• 运算对齐

• 缺失值出现的位置

• 与其他 Pandas 对象的组合方式

3、适当使用 name

name 看似不是必需项,但在实际分析中,它能显著提升结果的可读性,尤其是在与 DataFrame 相互转换时。

4、注意缺失值与类型变化

一旦引入新的标签,或发生标签不齐,往往就可能出现 NaN;而一旦出现 NaN,数据类型也可能从整数变成浮点型。这些现象都应结合 Pandas 的标签机制来理解,而不应简单视为“异常”。

5、区分“数组思维”和“标签思维”

如果只把 Series 看成“一维数组的外壳”,就很容易误解 Pandas 的行为。真正理解它,关键在于认识到:

• NumPy 更强调位置

• Pandas 更强调标签、对齐与数据语义

📘 小结

Series 是 Pandas 中最基础的一维带标签数据结构。理解 Series 的关键,在于把握“数据值 + 索引标签”的统一结构,以及由此产生的选择、对齐与缺失值行为。掌握其常见构建方式,是进一步学习 DataFrame 与 Pandas 数据分析的基础。

“点赞有美意,赞赏是鼓励”

http://www.cnnetsun.cn/news/1640741.html

相关文章:

  • XXL-SSO架构演进方法论:从业务驱动到技术创新
  • GKD代码混淆配置:ProGuard规则如何保护应用核心逻辑
  • 软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(3)
  • XXL-SSO与Active Directory集成:企业级身份管理终极方案
  • DanKoe 视频笔记:个人品牌构建:你不需要一个细分市场,你需要一个观点
  • XXL-SSO跨域资源共享(CORS)配置:前后端分离架构实践
  • StructBERT语义分析工具实测:一键判断句子相似度,支持GPU加速
  • ai辅助开发windows应用:让快马平台智能生成第三方api集成代码模块
  • 当CTO问我“为什么需要测试团队”时的血腥反击
  • 让大模型乖乖听话:新手程序员必备的Prompt写作秘籍(收藏版)
  • 3大模块深度优化华硕笔记本电池性能:从诊断到长效管理全指南
  • WechatBakTool技术解析与实战指南:微信聊天记录备份的完整解决方案
  • Breach浏览器终极参与指南:如何快速加入开发者社区并贡献代码
  • 5个隐藏技巧提升Motrix下载效率:从配置优化到性能调优全指南
  • Android-Job 终极指南:如何快速实现后台任务与GCM推送的完美集成
  • ONLYOFFICE国际化与多语言支持:面向全球用户的本地化策略
  • 终极指南:InvokeAI模型缓存优化技术 - 让AI绘图既快速又省内存
  • InvokeAI工具函数库:10个核心工具方法与实用辅助函数详解
  • Llama-3.2V-11B-cot多模态提示词(Prompt)编写入门指南
  • FFCV内存管理机制揭秘:进程缓存、OS缓存与页面调度算法
  • Pixel Language Portal部署指南:Hunyuan-MT-7B在Mac M2 Ultra(Metal加速)环境下的原生运行方案
  • Sushi实战:如何为Laravel应用创建国家、角色等固定数据模型
  • 深求·墨鉴(DeepSeek-OCR-2)惊艳效果:书法题跋+钤印位置+行气关系可视化还原
  • 【限时解密】某Top3金融级低代码平台内部调试手册(含17个不可外传的Component Debug Flag)
  • 从洛伦兹吸引子到三体问题:用Python RK45方法探索混沌与天体物理的奇妙世界
  • Omni-Vision Sanctuary 算法优化实践:利用 LSTM 提升序列生成任务效果
  • ESP-NOW工业无线开关控制:低延迟高可靠本地总线方案
  • Qwen3.5-2B效果实录:电商商品图识别+卖点文案生成+竞品对比分析
  • TurboDiffusion镜像评测:基于Wan2.1/Wan2.2的WebUI,视频生成速度实测惊艳
  • OpenClaw安全指南:Qwen3.5-9B任务权限控制与执行沙盒配置