【Python自动化】 21.3 Pandas Series 核心数据结构完全指南
一、Series 概述
什么是 Series?
Series 是 Pandas 两大核心数据结构之一(另一个是 DataFrame),是构建 DataFrame 的基础。
核心特征
- 带标签的一维数组
- 可保存任何类型数据(整数、字符串、浮点数、Python对象等)
- 由两个主要部分组成:
- 数据值:存储的实际数据
- 索引:与数据值相关联的标签
二、创建 Series 的四种方式
1. 从列表创建(最基本方式)
import pandas as pd# 创建简单 Series,使用默认索引
data = [10, 20, 30, 40]
s = pd.Series(data)
print(s)
输出:
0 10
1 20
2 30
3 40
dtype: int64
2. 指定自定义索引
# 创建时指定自定义索引
data = [10, 20, 30, 40]
custom_index = ['a', 'b', 'c', 'd']
s = pd.Series(data, index=custom_index)
print(s)
输出:
a 10
b 20
c 30
d 40
dtype: int64
3. 从字典创建(自动索引匹配)
# 字典键自动成为索引,字典值成为数据
data_dict = {'a': 10, 'b': 20, 'c': 30, 'd': 40}
s = pd.Series(data_dict)
print(s)
输出:
a 10
b 20
c 30
d 40
dtype: int64
4. 从标量创建(复制值)
# 单个标量值 + 索引,值会被复制
s = pd.Series(5, index=['a', 'b', 'c', 'd'])
print(s)
输出:
a 5
b 5
c 5
d 5
dtype: int64
三、Series 基本操作
查看索引和数据值
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])print(s.index) # 输出:Index(['a', 'b', 'c', 'd'], dtype='object')
print(s.values) # 输出:[10 20 30 40]
print(s.dtype) # 输出:int64
索引访问数据
# 通过标签索引访问
print(s['a']) # 输出:10# 通过位置索引访问
print(s[0]) # 输出:10# 访问多个元素
print(s[['a', 'c']])
输出:
a 10
c 30
dtype: int64
切片操作
# 基于位置的切片(不包括结束位置)
print(s[0:2]) # 输出:a=10, b=20# 基于标签的切片(包括结束位置)
print(s['a':'c']) # 输出:a=10, b=20, c=30
四、向量化操作与数据过滤
向量化数学运算
s = pd.Series([1, 2, 3, 4])print(s + 5) # 每个元素加5
print(s * 2) # 每个元素乘2
print(s > 2) # 布尔判断
输出:
0 6
1 7
2 8
3 9
dtype: int640 2
1 4
2 6
3 8
dtype: int640 False
1 False
2 True
3 True
dtype: bool
布尔条件过滤
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
filtered_s = s[s > 25] # 筛选值大于25的元素
print(filtered_s)
输出:
c 30
d 40
dtype: int64
五、索引对齐特性(重要!)
索引对齐运算
s1 = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = pd.Series([4, 5, 6], index=['b', 'c', 'd'])result = s1 + s2 # 按索引标签对齐,不是按位置!
print(result)
输出:
a NaN # s1有'a',s2没有 → NaN
b 6.0 # s1['b'](2) + s2['b'](4) = 6
c 8.0 # s1['c'](3) + s2['c'](5) = 8
d NaN # s2有'd',s1没有 → NaN
dtype: float64
六、常用属性和方法
数据查看方法
s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])print(s.head(3)) # 查看前3行
print(s.tail(3)) # 查看后3行
print(s.describe()) # 描述性统计
数据处理方法
# 唯一值和频次统计
s = pd.Series(['a', 'b', 'a', 'c', 'b', 'a'])
print(s.unique()) # 输出:['a' 'b' 'c']
print(s.value_counts()) # 输出:a=3, b=2, c=1# 空值处理
s_with_nan = pd.Series([1, 2, None, 4])
print(s_with_nan.isna()) # 检查空值
print(s_with_nan.dropna()) # 删除空值
print(s_with_nan.fillna(0)) # 填充空值
排序方法
s = pd.Series([3, 1, 4, 2], index=['d', 'a', 'c', 'b'])print(s.sort_values()) # 按值排序
print(s.sort_index()) # 按索引排序
七、字典式操作方法
类似字典的操作
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])# 检查索引存在性
print('a' in s) # 输出:True
print('x' in s) # 输出:False# 安全获取值
print(s.get('x', 0)) # 索引不存在时返回0
print(s.get('a', 0)) # 索引存在时返回值
八、综合示例
实际应用场景
# 创建学生成绩Series
grades = pd.Series([85, 92, 78, 90], index=['Alice', 'Bob', 'Charlie', 'Diana'],name='Math_Scores')# 基本分析
print("平均分:", grades.mean())
print("最高分:", grades.max())
print("最低分:", grades.min())# 条件筛选
good_students = grades[grades > 85]
print("85分以上的学生:")
print(good_students)# 添加新数据
grades['Eve'] = 88
print("添加新学生后的成绩单:")
print(grades)
九、总结对比
特性 | 描述 |
---|---|
本质 | 带标签的一维数组 |
组成 | 数据值 + 索引 |
创建方式 | 列表、字典、标量 |
核心操作 | 索引访问、向量化运算、布尔过滤 |
核心特性 | 索引对齐:运算时按标签对齐,而非位置 |
主要用途 | 数据分析、数据清洗、作为DataFrame的单列 |
十、最佳实践建议
- 明确指定索引:避免依赖默认整数索引
- 利用向量化操作:避免使用循环,提高性能
- 注意索引对齐:理解Series运算的底层机制
- 合理使用数据类型:选择合适的数据类型节省内存
- 熟练掌握常用方法:
value_counts()
,isna()
,fillna()
等
Series 是 Pandas 的基石,熟练掌握它是有效使用 Pandas 进行数据分析的关键第一步。