Pandas 数据结构 – Series(千字长文)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在数据分析与处理领域,Pandas 数据结构 – Series 是 Python 中最基础且强大的工具之一。无论是处理结构化数据、执行统计计算,还是进行数据清洗,Series 都如同一把多功能的瑞士军刀,为开发者提供了灵活而高效的操作接口。对于编程初学者而言,理解 Series 的核心特性与操作逻辑,能够快速构建数据处理的基础能力;而对中级开发者来说,深入掌握其底层机制,有助于优化复杂场景下的代码效率。本文将从 Series 的基本概念出发,结合实例与代码,系统性地解析其应用场景与技术要点。


一、Series 的基本概念与创建

1.1 Series 是什么?

可以将 Series 理解为一个带标签的、一维的有序数组。它与 NumPy 的一维数组(ndarray)类似,但区别在于 Series 的每个元素都关联了一个索引标签(Index),这使得数据检索和操作更加直观。

  • 形象比喻:Series 类似于 Excel 表格中的一列数据,其中每一行都有一个唯一的“行号”(即索引),而这一列可以存储数字、字符串甚至复杂对象。

1.2 如何创建 Series?

示例 1:从列表或 NumPy 数组创建

import pandas as pd
import numpy as np

s1 = pd.Series([10, 20, 30, 40])
print(s1)

s2 = pd.Series([10, 20, 30, 40], index=['Q1', 'Q2', 'Q3', 'Q4'])
print(s2)

示例 2:从字典创建

data_dict = {'apple': 3.5, 'banana': 2.8, 'orange': 4.1}
s3 = pd.Series(data_dict)
print(s3)

二、Series 的核心属性与操作

2.1 索引(Index)与数据(Values)

Series 的两个核心属性是 .index.values,分别对应索引标签和底层数据。

print("索引:", s2.index)
print("数据:", s2.values)

2.2 索引操作:标签 vs. 位置

  • 通过标签访问:使用 s.loc,例如 s2.loc['Q2'] 返回对应值。
  • 通过位置访问:使用 s.iloc,例如 s2.iloc[1] 返回第二个元素的值。
print(s2.loc['Q3'])  # 输出 30
print(s2.iloc[2])    # 输出 30

2.3 数据类型与缺失值

Series 的数据类型由 .dtype 属性定义,支持自动类型推断。若数据包含缺失值(NaN),可使用 .isnull().notnull() 进行筛选。

s4 = pd.Series([1, 2, None, 4], dtype='float64')
print(s4.dtype)       # 输出 float64
print(s4.isnull())    # 判断每个元素是否为 NaN

三、Series 的运算与对齐机制

3.1 算术运算与广播

Series 支持标准的算术运算(如加、减、乘、除),运算会自动对齐索引标签,而非位置。

s5 = pd.Series([10, 20, 30], index=['A', 'B', 'C'])
s6 = pd.Series([1, 2, 3], index=['B', 'C', 'D'])

result = s5 + s6
print(result)

3.2 对齐机制的重要性

形象比喻:Series 的对齐机制类似于拼图游戏,只有相同标签的“拼图块”才能完美契合,否则会留下空缺(NaN)。这一特性在合并多个数据源时尤为重要,确保了数据关联的准确性。


四、Series 的高级功能与实际应用

4.1 数据排序与筛选

通过 .sort_values().sort_index() 可以对 Series 进行排序,而布尔索引则支持复杂条件筛选。

sorted_s = s2.sort_values(ascending=True)

filtered_s = s2[s2 > 25]

4.2 应用案例:销售数据统计

假设我们有一组季度销售额数据,可通过 Series 计算平均值、最高值,并生成增长趋势报告。

sales = pd.Series([12000, 15000, 18000, 21000], 
                  index=['2023-Q1', '2023-Q2', '2023-Q3', '2023-Q4'])

growth = sales.pct_change() * 100
print("增长率:\n", growth)

annual_sales = sales.sum()
print("年度总销售额:", annual_sales)

五、Series 的局限性与优化建议

5.1 Series 的局限性

  • 维度限制:Series 是一维结构,无法直接处理二维或多维数据(需使用 DataFrame)。
  • 性能瓶颈:对于超大规模数据(如百万级行),直接操作 Series 可能导致内存或计算效率问题,此时需结合 NumPy 或优化算法。

5.2 优化技巧

  • 避免频繁修改索引:索引的重建会消耗额外资源,建议一次性设置好标签。
  • 利用矢量化操作:尽量用内置函数(如 .apply())替代循环,例如:
    # 矢量化计算折扣价
    discounted = sales * 0.9
    

六、Series 与其他数据结构的交互

6.1 Series 与 DataFrame

DataFrame 是由多个 Series 组成的二维表结构。可以通过以下方式转换:

df = s2.to_frame(name='Sales')
print(df)

column_s = df['Sales']

6.2 Series 与 NumPy 的互操作

numpy_array = s2.values

new_series = pd.Series(numpy_array, index=s2.index)

七、进阶技巧与常见问题解答

7.1 如何处理重复索引?

Pandas 允许存在重复索引,但部分操作(如 loc)可能返回多个值,需谨慎使用。

s7 = pd.Series([10, 20, 30], index=['A', 'A', 'B'])
print(s7.loc['A'])  # 输出两个值组成的 Series

7.2 如何快速统计唯一值?

使用 .unique().value_counts()

unique_values = s7.unique()
counts = s7.value_counts()
print(counts)

八、结论

Pandas 数据结构 – Series 是数据分析的基石,其灵活性与功能性使其在数据预处理、统计计算等领域不可或缺。通过掌握 Series 的创建、索引操作、算术运算及高级功能,开发者能够高效地处理单列数据,并为后续的复杂分析(如多维数据处理或机器学习)奠定基础。无论是初学者通过简单示例入门,还是中级开发者通过优化技巧提升效率,Series 的强大生态始终是通往数据科学之路上的一块关键拼图。

如需进一步探索,可深入学习 DataFrame、数据对齐策略或 Pandas 的性能优化技术,逐步构建完整的数据分析能力体系。

最新发布