1.1 创建
构造方法:pd.Series()
- 从列表创建
- 从元组创建
- 从 ndarray 创建
- 从字典创建
- 从标量创建
- 从 range 创建
- 从生成器创建
import pandas as pd
import numpy as np
# 从列表创建
s1 = pd.Series([1, 2, 3, 4])
# 从元组创建
s2 = pd.Series((1, 2, 3))
# 从 ndarray 创建
s3 = pd.Series(np.array([1, 2, 3]))
# 从字典创建(键作为索引)
s4 = pd.Series({'a': 1, 'b': 2})
# 从标量创建(必须指定 index)
s5 = pd.Series(5, index=['a', 'b', 'c'])
# 从 range 创建
s6 = pd.Series(range(1, 5))
# 从生成器创建
s7 = pd.Series(i * 2 for i in range(5))构造参数:
| 参数 | 说明 |
|---|---|
data | 数据源:列表、元组、ndarray、字典、标量、range、生成器 |
index | 索引标签,需与数据长度一致,默认 RangeIndex |
dtype | 数据类型,如 'int64'、'float64'、'object'、'category' 等 |
name | Series 名称,后续可用于 to_frame() 的列名 |
copy | 是否复制输入数据,默认 False |
1.2 属性
| 属性 | 说明 |
|---|---|
values | 返回底层 NumPy 数组 |
array | 返回 ExtensionArray(支持 pandas 扩展类型) |
dtype | 数据类型(如 int64、float64) |
dtypes | 与 dtype 相同,统一接口 |
name | Series 名称 |
index | 索引对象 |
axes | 返回 [index] 列表 |
shape | 形状元组,如 (4,) |
size | 元素个数 |
ndim | 维度数,Series 恒为 1 |
nbytes | 底层数据字节数 |
memory_usage | 内存占用(含索引,可通过 deep=True 深度计算) |
empty | 是否为空 |
hasnans | 是否包含 NaN |
attrs | 全局属性字典(自定义元数据) |
flags | 行为标志(如 allows_duplicate_labels) |
s = pd.Series([1, 2, 3], name='数值')
print(s.values) # [1 2 3]
print(s.dtype) # int64
print(s.shape) # (3,)
print(s.ndim) # 1
print(s.size) # 3
print(s.name) # 数值
print(s.index) # RangeIndex(start=0, stop=3, step=1)1.3 索引与选择
索引方式:
| 方式 | 语法 | 说明 |
|---|---|---|
| 位置索引 | s[0]、s[1:3] | 按位置取值(Python 切片语义) |
| 标签索引 | s.loc['a']、s.loc['a':'c'] | 按标签取值,包含端点 |
| 位置索引 | s.iloc[0]、s.iloc[1:3] | 严格按位置取值,不包含端点 |
| 快速标量 | s.at['a'] | 按标签取标量,速度最快 |
| 快速标量 | s.iat[0] | 按位置取标量,速度最快 |
| 布尔索引 | s[s > 2] | 使用布尔数组过滤 |
相关方法:
| 方法 | 说明 |
|---|---|
s.get(key) | 获取标签对应的值,不存在时返回 None 或指定默认值 |
s.where(cond) | 条件为 False 的位置替换为 NaN 或其他指定值 |
s.mask(cond) | where 的反操作:条件为 True 的位置替换为 NaN |
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
s.loc['a'] # 10
s.iloc[0] # 10
s.at['b'] # 20
s.iat[1] # 20
s[s > 20] # 筛选大于 20 的元素
s.get('x', -1) # 不存在时返回 -1
s.where(s > 15) # 不满足条件的位置为 NaN1.4 转换
| 方法 | 说明 |
|---|---|
astype(dtype) | 转换为指定数据类型 |
convert_dtypes() | 自动推断为最佳可空类型 |
infer_objects() | 推断更具体的 object 类型 |
copy() | 复制 Series(深拷贝) |
to_numpy() | 转换为 NumPy 数组 |
to_list() | 转换为 Python 列表 |
to_frame() | 转换为 DataFrame |
to_dict() | 转换为字典({索引: 值}) |
to_csv() | 输出到 CSV 文件 |
to_json() | 输出到 JSON |
to_excel() | 输出到 Excel |
to_pickle() | 序列化为 pickle 格式 |
item() | 单元素 Series 转为 Python 标量 |
keys() | 返回索引对象 |
items() | 返回 (索引, 值) 对的可迭代对象 |
s = pd.Series([1, 2, 3])
s.to_list() # [1, 2, 3]
s.to_dict() # {0: 1, 1: 2, 2: 3}
s.to_frame() # DataFrame with one column
s.astype('float') # 转换为 float641.5 方法
索引操作
| 方法 | 说明 |
|---|---|
reindex(labels) | 按新索引重新排列,缺失索引填 NaN |
reindex_like(other) | 按另一个 Series/DataFrame 的索引对齐 |
reset_index() | 索引重置为默认 RangeIndex |
rename(index=...) | 重命名索引标签 |
rename_axis(name) | 设置或重命名索引轴名称 |
set_axis(labels) | 一次性替换索引 |
droplevel(level) | 删除 MultiIndex 的指定层级 |
swaplevel() | 交换 MultiIndex 的两个层级 |
排序
| 方法 | 说明 |
|---|---|
sort_values() | 按值排序 |
sort_index() | 按索引排序 |
rank() | 计算排名(可指定方法:average、min、max 等) |
nlargest(n) | 前 n 个最大值 |
nsmallest(n) | 前 n 个最小值 |
argsort() | 返回排序后的位置索引 |
searchsorted(v) | 查找值应插入的位置索引 |
去重
| 方法 | 说明 |
|---|---|
duplicated() | 标记重复值 |
drop_duplicates() | 删除重复值 |
unique() | 返回唯一值数组 |
nunique() | 唯一值个数 |
value_counts() | 各值的频次统计 |
统计
| 方法 | 说明 |
|---|---|
count() | 非缺失值个数 |
sum() | 求和 |
mean() | 均值 |
std() | 标准差 |
var() | 方差 |
min() | 最小值 |
max() | 最大值 |
median() | 中位数 |
mode() | 众数 |
quantile(q) | 分位数 |
sem() | 标准误差 |
skew() | 偏度 |
kurt() | 峰度 |
describe() | 综合统计摘要 |
累积
| 方法 | 说明 |
|---|---|
cumsum() | 累积和 |
cumprod() | 累积积 |
cummin() | 累积最小值 |
cummax() | 累积最大值 |
差分
| 方法 | 说明 |
|---|---|
diff() | 一阶差分(当前值 - 前值) |
pct_change() | 百分比变化率 |
缺失值
| 方法 | 说明 |
|---|---|
fillna(value) | 填充缺失值 |
dropna() | 删除缺失值 |
ffill() | 前向填充(用前一值填充) |
bfill() | 后向填充(用后一值填充) |
interpolate() | 插值填充(线性、多项式等) |
replace(old, new) | 替换指定值 |
函数应用
| 方法 | 说明 |
|---|---|
apply(func) | 对每个元素应用函数 |
map(func) | 元素级映射(常用于字典替换) |
agg(func) | 聚合操作(可与 groupby 配合) |
aggregate(func) | agg 的完整别名 |
transform(func) | 对数据执行转换,保持形状 |
pipe(func) | 管道链式调用函数 |
其他
| 方法 | 说明 |
|---|---|
clip(lower, upper) | 裁剪到指定范围 |
round(n) | 四舍五入到指定位数 |
abs() | 绝对值 |
add_prefix('x_') | 给索引添加前缀 |
add_suffix('_y') | 给索引添加后缀 |
compare(other) | 与另一个 Series 逐元素比较,输出差异 |
combine(other, func) | 按元素级合并运算 |
combine_first(other) | 用 other 中的值填充缺失值 |
dot(other) | 向量点积 |
equals(other) | 判断两个 Series 是否完全相等 |
factorize() | 将类别编码为数值型(类似 LabelEncoder) |
explode() | 将单元格中的列表/元组展开为多行 |
isin(values) | 判断元素是否属于指定值集合 |
between(left, right) | 判断元素是否在闭区间内 |
sample(n) | 随机抽样 |
take(indices) | 按位置索引取值 |
tail(n) | 末尾 n 个元素 |
head(n) | 开头 n 个元素 |
first(offset) | 时间序列:返回开头直到 offset 的数据 |
last(offset) | 时间序列:返回从 offset 到末尾的数据 |
all() | 所有元素是否都为 True |
any() | 任一元素是否为 True |
prod() | 连乘积 |
示例:Series 常用方法演示
s = pd.Series([3, 1, 2, 2, np.nan]) s.value_counts() # 频次统计 s.cumsum() # 累积和 s.fillna(0) # 填充缺失值 s.isin([1, 2]) # 判断是否在集合中 s.between(1, 2) # 判断是否在闭区间内 s.sort_values() # 按值排序