🐼 Pandas 基础篇:DataFrame 与 Series,两大核心数据结构

4 阅读7分钟

在数据分析领域,Python 生态中的 Pandas 库堪称“瑞士军刀”,其高效的数据处理能力和灵活的数据结构设计,让无数开发者从繁琐的数据清洗与转换中解放出来。而支撑这一切的核心,正是 Pandas 的两大基石——Series 和 DataFrame。理解它们的本质、特性及关联,是掌握 Pandas 的第一步。本文将从定义、结构、创建方式、核心操作等维度,深入剖析这两大数据结构,助你构建扎实的 Pandas 基础。

一、Series:带标签的一维数组

1.1 什么是 Series?

Series 是 Pandas 中最基础的一维数据结构,可理解为“带标签的数组”。它不仅能存储任意类型的数据(整数、浮点数、字符串、对象等),还能为每个元素分配一个唯一的“标签”(称为索引,Index)。这种“数据+标签”的组合,让 Series 既保留了数组的高效存储能力,又具备了字典式的标签访问特性。

1.2 Series 的结构

一个 Series 由两部分组成:

数据值(Values):存储实际数据的 NumPy 数组(或类似数组的结构);

索引(Index):存储标签的数组,默认是从 0 开始的整数序列,也可自定义为字符串、日期等类型。

例如,一个包含学生成绩的 Series 可能如下:

import pandas as pd scores = pd.Series([90, 85, 95, 88], index=["Alice", "Bob", "Charlie", "David"]) print(scores)

输出结果:

Alice 90 Bob 85 Charlie 95 David 88 dtype: int64

这里,[90, 85, 95, 88] 是数据值,["Alice", "Bob", "Charlie", "David"] 是自定义索引,每个标签对应一个成绩。

1.3 Series 的创建方式

Series 的创建非常灵活,常见方式包括:

(1)从列表/数组创建(最常用)

直接传入数据列表,索引默认从 0 开始:

s1 = pd.Series([10, 20, 30, 40]) # 默认索引:0, 1, 2, 3

(2)指定自定义索引

通过 index 参数传入标签列表:

s2 = pd.Series([10, 20, 30], index=["a", "b", "c"]) # 索引为 ["a", "b", "c"]

(3)从字典创建

字典的键会自动作为索引,值作为数据:

s3 = pd.Series({"name": "Pandas", "version": 2.0, "author": "Wes McKinney"}) # 输出: # name Pandas # version 2.0 # author Wes McKinney # dtype: object

(4)从标量值创建

若只传入一个标量,需指定索引长度,所有元素均为该标量:

s4 = pd.Series(5, index=["x", "y", "z"]) # 输出:x:5, y:5, z:5

1.4 Series 的核心操作

Series 的操作逻辑融合了数组和字典的特性,以下是几个高频场景:

(1)按标签/位置访问元素

标签访问(类似字典):s.loc["label"]

位置访问(类似数组):s.iloc[index]

s = pd.Series([90, 85, 95], index=["A", "B", "C"]) print(s.loc["B"]) # 85(按标签) print(s.iloc[1]) # 85(按位置,第2个元素)

(2)向量化运算

Series 支持对整个数据集进行加减乘除等运算,无需循环:

s = pd.Series([1, 2, 3]) print(s * 2) # 输出:[2, 4, 6] print(s + s) # 输出:[2, 4, 6](对应元素相加)

(3)缺失值处理

Pandas 用 NaN(Not a Number)表示缺失值,可通过 isna()/notna() 检测:

s = pd.Series([1, None, 3]) print(s.isna()) # 输出:[False, True, False]

二、DataFrame:二维表格型数据结构

2.1 什么是 DataFrame?

如果说 Series 是一维的“带标签数组”,那么 DataFrame 就是二维的“带标签表格”。它由多个 Series 按列组合而成,每列是一个 Series,所有列共享同一个行索引。这种结构完美模拟了 Excel 表格或 SQL 表,是数据分析中最常用的对象。

2.2 DataFrame 的结构

DataFrame 的核心要素包括:

行索引(Index):标识每一行的标签(如样本 ID、时间戳);

列索引(Columns):标识每一列的标签(如特征名、指标名);

数据区域:存储实际数据的二维数组(底层为 NumPy 数组)。

例如,一个学生信息表可表示为:

NameAgeScoreAlice1890Bob1985Charlie2095

用 DataFrame 实现:

data = { "Name": ["Alice", "Bob", "Charlie"], "Age": [18, 19, 20], "Score": [90, 85, 95] } df = pd.DataFrame(data) print(df)

2.3 DataFrame 的创建方式

DataFrame 的创建同样灵活,常见场景包括:

(1)从字典创建(最常用)

字典的键作为列名,值为各列数据(列表或数组,长度需一致):

data = {"Name": ["A", "B"], "Age": [20, 21]} df = pd.DataFrame(data)

(2)从列表嵌套字典创建

每个字典代表一行,键为列名:

data = [ {"Name": "A", "Age": 20}, {"Name": "B", "Age": 21, "Score": 90} # 允许部分列缺失(自动填充 NaN) ] df = pd.DataFrame(data)

(3)从 NumPy 数组创建

需显式指定列名和行索引:

import numpy as np arr = np.array([[1, 2], [3, 4]]) df = pd.DataFrame(arr, columns=["Col1", "Col2"], index=["Row1", "Row2"])

(4)读取外部文件

实际分析中,DataFrame 常通过 read_csv()、read_excel() 等函数从文件加载:

df = pd.read_csv("data.csv") # 从 CSV 文件读取

2.4 DataFrame 的核心操作

DataFrame 提供了丰富的 API,覆盖数据筛选、聚合、合并等全流程需求,以下是最核心的几类操作:

(1)数据查看与基本信息

head(n)/tail(n):查看前/后 n 行(默认 5 行);

info():查看数据类型、非空值数量等元信息;

describe():统计数值列的描述性统计量(均值、标准差、分位数等)。

df = pd.read_csv("students.csv") print(df.head(2)) # 查看前 2 行 print(df.info()) # 查看列类型和非空值 print(df.describe()) # 统计数值列

(2)数据选择与过滤

按列选择:df["列名"] 或 df.列名(返回 Series),df[["列1", "列2"]](返回子 DataFrame);

按行选择:df.loc[行标签](按标签)、df.iloc[行位置](按位置);

条件过滤:df[df["列名"] > 阈值](类似 SQL 的 WHERE 子句)。

选择 "Score" 列 print(df["Score"]) # 选择 Age>18 且 Score>80 的行 filtered = df[(df["Age"] > 18) & (df["Score"] > 80)]

(3)数据修改与新增

修改列值:df["列名"] = 新值(整列修改)或 df.loc[行, "列名"] = 值(单个元素修改);

新增列:df["新列名"] = 计算表达式(如 df["Total"] = df["Math"] + df["English"]);

删除列/行:df.drop("列名", axis=1)(删除列)、df.drop(行标签, axis=0)(删除行)。

(4)数据聚合与分组

通过 groupby() 实现按列分组后的聚合(求和、均值、计数等):

按 "Class" 分组,计算每个班的平均分 avg_score = df.groupby("Class")["Score"].mean()

三、Series 与 DataFrame 的关系:整体与部分

Series 和 DataFrame 并非孤立存在,而是“部分与整体”的关系:

DataFrame 是 Series 的集合:DataFrame 的每一列都是一个 Series,且所有列共享行索引;

Series 是特殊的 DataFrame:当 DataFrame 只有一列时,可视为一个 Series(但类型不同,需注意转换)。

这种关系使得两者能无缝协作。例如,从 DataFrame 中提取一列得到 Series,对 Series 运算后再赋值回 DataFrame:

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) s = df["A"] # 提取列 A 为 Series s = s * 2 # 对 Series 运算 df["A_doubled"] = s # 将结果作为新列加入 DataFrame

四、为什么需要理解这两大结构?

在数据分析中,Series 和 DataFrame 的设计解决了两个核心痛点:

标签化访问:告别“记位置不记含义”的数组操作,用业务相关的标签(如“用户ID”“销售额”)直接定位数据,提升代码可读性和可维护性;

异构数据整合:DataFrame 允许不同列存储不同类型数据(数值、文本、日期),轻松处理现实中的复杂表格。

无论是数据清洗、特征工程还是建模准备,几乎所有操作都围绕这两大结构展开。掌握它们,就掌握了 Pandas 的“任督二脉”。

五、总结

Pandas 的 Series 和 DataFrame 是数据分析的“左膀右臂”:Series 以一维带标签的形式处理单变量数据,DataFrame 以二维表格形式整合多变量数据,两者通过“列-行”关系紧密关联。理解它们的结构、创建方式和核心操作,是高效使用 Pandas 的前提。

对于初学者,建议从“用 Series 处理单列数据,用 DataFrame 管理多列表格”入手,逐步尝试数据筛选、聚合、合并等进阶操作。随着实践深入,你会发现:Pandas 的强大,正源于这两大基础结构的精妙设计。

下一篇,我们将深入 Series 和 DataFrame 的高级操作(如合并、重塑、时间序列处理),敬请期待!

(注:文中示例代码均基于 Pandas 1.5+ 版本,确保兼容性。)