3. Pandas 基础:Series 与 DataFrame 的创建、索引与切片、数据读取

Pandas 是 Python 数据分析的核心库,它提供了两种主要的数据结构:Series(一维标签数组)和 DataFrame(二维表格数据结构)。本章将系统讲解这两种结构的创建、索引与切片操作,以及从 CSV、Excel、JSON 等常见文件格式中读取数据的方法。

课前准备: 确保已安装 Pandas 库(pip install pandas openpyxl),并准备好一个示例 CSV 文件或使用 Pandas 内置数据集。

3.1 Series 的创建与基本操作

Series 是一种类似于一维数组的对象,它由一组数据(各种 NumPy 数据类型)以及一组与之相关的数据标签(即索引)组成。

3.1.1 创建 Series

可以通过列表、NumPy 数组或字典来创建 Series:

import pandas as pd
import numpy as np

# 从列表创建,默认索引为 0,1,2,...
s1 = pd.Series([10, 20, 30, 40])
print(s1)

# 指定索引
s2 = pd.Series([85, 92, 78, 96], index=['张三', '李四', '王五', '赵六'])
print(s2)

# 从字典创建,键自动成为索引
s3 = pd.Series({'CPU': 78.5, '内存': 92.3, '磁盘': 65.1})
print(s3)
关键点: Series 的索引(index)和数据(values)是两个核心属性,可通过 s.index 和 s.values 分别获取。

3.1.2 Series 的索引与切片

Series 支持位置索引和标签索引两种方式:

# 位置索引(类似列表)
print(s2[0])       # 输出:85
print(s2[1:3])     # 切片,输出索引1和2的数据

# 标签索引
print(s2['张三'])  # 输出:85
print(s2[['张三', '王五']])  # 通过标签列表获取多个值

# 使用 .iloc(位置)和 .loc(标签)显式索引
print(s2.iloc[0])      # 位置索引
print(s2.loc['张三'])  # 标签索引
注意: 当索引为整数时,s[0] 默认使用标签索引,容易混淆。建议始终使用 .iloc 和 .loc 进行显式索引。
Series 索引与切片结构 索引标签 索引标签 索引标签 索引标签 索引标签 数据值 数据值 数据值 数据值 数据值 s[1:3] 切片 → 位置1-2 s.loc['标签'] → 标签索引

3.2 DataFrame 的创建与基本操作

DataFrame 是 Pandas 中最常用的数据结构,它是一个表格型的数据结构,包含一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。

3.2.1 创建 DataFrame

可以通过字典、列表、NumPy 数组或从文件读取来创建 DataFrame:

# 从字典创建(键为列名,值为列数据)
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 28, 35],
    '部门': ['技术部', '市场部', '技术部', '财务部'],
    '薪资': [15000, 12000, 18000, 16000]
}
df = pd.DataFrame(data)
print(df)

# 指定行索引
df2 = pd.DataFrame(data, index=['A', 'B', 'C', 'D'])
print(df2)

# 从 NumPy 数组创建
arr = np.random.randn(4, 3)
df3 = pd.DataFrame(arr, columns=['特征1', '特征2', '特征3'])
print(df3)

3.2.2 DataFrame 的索引与切片

DataFrame 支持列索引、行索引以及混合索引:

# 列索引:获取单列或多列
print(df['姓名'])           # 返回 Series
print(df[['姓名', '薪资']]) # 返回 DataFrame

# 行索引:使用 .loc(标签)和 .iloc(位置)
print(df.loc[0])            # 获取第0行(标签索引)
print(df.iloc[0])           # 获取第0行(位置索引)
print(df.loc[0:2])          # 切片行(包含结束)
print(df.iloc[0:2])         # 切片行(不包含结束)

# 混合索引:同时选择行和列
print(df.loc[0:2, ['姓名', '薪资']])
print(df.iloc[0:2, 0:2])

# 条件索引(布尔索引)
print(df[df['年龄'] > 28])
最佳实践: 在数据分析中,.loc 和 .iloc 是最推荐的索引方式,它们语义清晰,能避免歧义。
DataFrame 二维索引结构 行索引 0 1 2 3 列A 值A0 值A1 值A2 值A3 列B 值B0 值B1 值B2 值B3 列C 值C0 值C1 值C2 值C3 df['列A'] → 列索引 df.loc[0] → 行索引 df.iloc[0:2, 0:2] → 混合切片

3.3 数据读取:CSV / Excel / JSON

Pandas 提供了强大的 I/O 功能,可以轻松读取各种格式的数据文件。以下是三种最常用格式的读取方法:

文件格式 读取函数 常用参数 典型应用场景
CSV pd.read_csv() filepath, sep, encoding, header, index_col 日志数据、导出表格、KPI 指标数据
Excel pd.read_excel() filepath, sheet_name, header, usecols 财务报表、业务报表、配置清单
JSON pd.read_json() filepath, orient, lines API 返回数据、NoSQL 导出、配置数据

3.3.1 读取 CSV 文件

# 基本读取
df_csv = pd.read_csv('data/kpi_data.csv')
print(df_csv.head())  # 查看前5行

# 指定分隔符和编码
df_csv2 = pd.read_csv('data/kpi_data.tsv', sep='\t', encoding='utf-8')

# 指定索引列
df_csv3 = pd.read_csv('data/kpi_data.csv', index_col='日期')

# 只读取部分列
df_csv4 = pd.read_csv('data/kpi_data.csv', usecols=['日期', 'CPU使用率', '内存使用率'])

3.3.2 读取 Excel 文件

# 读取默认工作表(第一个)
df_excel = pd.read_excel('data/kpi_report.xlsx')
print(df_excel.head())

# 指定工作表名称
df_excel2 = pd.read_excel('data/kpi_report.xlsx', sheet_name='月度汇总')

# 指定读取范围
df_excel3 = pd.read_excel('data/kpi_report.xlsx', sheet_name='Sheet1', usecols='A:C')

3.3.3 读取 JSON 文件

# 读取标准 JSON 文件
df_json = pd.read_json('data/kpi_data.json')
print(df_json.head())

# 读取行分隔的 JSON(每行一个 JSON 对象)
df_json2 = pd.read_json('data/kpi_data_lines.json', lines=True)

# 指定 orient 参数处理不同结构的 JSON
# orient='records':列表嵌套字典
# orient='index':字典嵌套字典(键为索引)
# orient='columns':字典嵌套字典(键为列名)
df_json3 = pd.read_json('data/kpi_data_index.json', orient='index')
实战技巧: 在读取大文件时,可以使用 chunksize 参数分块读取,避免内存溢出。例如:for chunk in pd.read_csv('large_file.csv', chunksize=10000): process(chunk)
Pandas 数据读取流程架构 CSV 文件 .csv / .tsv Excel 文件 .xlsx / .xls JSON 文件 .json pd.read_csv() pd.read_excel() pd.read_json() DataFrame 对象

3.4 实战案例:读取 KPI 指标数据并查看基本信息

以下是一个完整的实战案例,演示如何读取 KPI 指标数据并进行初步探索:

import pandas as pd

# 1. 读取 CSV 格式的 KPI 数据
df_kpi = pd.read_csv('kpi_dashboard_data.csv', encoding='utf-8')

# 2. 查看数据基本信息
print("数据形状:", df_kpi.shape)
print("列名:", df_kpi.columns.tolist())
print("数据类型:\n", df_kpi.dtypes)

# 3. 查看前几行数据
print("前5行数据:\n", df_kpi.head())

# 4. 查看统计摘要
print("统计摘要:\n", df_kpi.describe())

# 5. 检查缺失值
print("缺失值统计:\n", df_kpi.isnull().sum())

# 6. 按条件筛选数据
high_cpu = df_kpi[df_kpi['CPU使用率'] > 90]
print("CPU使用率超过90%的记录:\n", high_cpu)
扩展阅读: Pandas 还支持读取 HTML、SQL、Parquet、Feather 等多种格式。在实时监控大屏项目中,CSV 和 JSON 是最常用的数据交换格式。

3.5 本章小结

本章学习了 Pandas 的两大核心数据结构——Series 和 DataFrame 的创建、索引与切片操作,以及从 CSV、Excel、JSON 文件中读取数据的方法。这些基础操作是后续进行数据清洗、转换、分析和可视化的前提。在下一阶段,我们将基于这些技能,进一步学习数据清洗与预处理技术。