0. 本章学习目标
学完本章,你需要能回答 4 个问题:
- NumPy 是干什么的?
用来做高效数值计算,核心对象是数组ndarray。 - Pandas 是干什么的?
用来做数据分析和处理,核心对象是Series和DataFrame。 - Matplotlib 是干什么的?
用来做数据可视化,把数据画成折线图、散点图、柱状图等。 - 三剑客如何配合?
一般流程是:NumPy 生成/计算数据→Pandas 整理/分析数据→Matplotlib 可视化展示数据。
1. 环境准备
1.1 安装依赖
如果你使用的是 Anaconda 的 base 环境,通常已经自带 NumPy、Pandas、Matplotlib。
但是如果你新建了虚拟环境,需要手动安装:
bash
pip install numpy pandas matplotlib
1.2 测试环境是否可用
课堂代码文件:01-测试numpy_pandas_matplotlib环境.py
python
# 如何测试导包成功,按住ctrl+鼠标左键,能查看源代码就ok
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
判断方式:在 PyCharm 中按住 Ctrl + 鼠标左键 点击 numpy、pandas、matplotlib,能跳转源码或库定义,说明导包成功。
2. NumPy 入门
2.1 NumPy 的定位
NumPy 主要用于:
- 数值计算
- 数组运算
- 批量计算
- 科学计算、数据分析的底层基础
你可以把 NumPy 理解成:Python 中专门处理"数字矩阵 / 数组"的工具库。
2.2 导包方式
python
import numpy as np
通常约定把 numpy 简写为 np。
2.3 创建 NumPy 数组
最常见方式:把 Python 列表转换为 NumPy 数组。
python
my_list = [[10, 20], [30, 40]]
my_array = np.array(my_list)
此时:
my_list是 Python 原生列表my_array是 NumPy 数组,也叫ndarray
2.4 数组基础运算
NumPy 数组支持批量运算:
python
my_array + 2
my_array - 2
my_array * 2
my_array / 2
注意:这些操作不会只操作某一个元素,而是对数组中的每个元素都执行相同运算。
例如:
python
[[10, 20], [30, 40]] + 2
含义是:
latex
[[12, 22], [32, 42]]
2.5 常用统计函数
| 函数 | 作用 |
|---|---|
np.max(my_array) |
最大值 |
np.min(my_array) |
最小值 |
np.sum(my_array) |
求和 |
np.mean(my_array) |
平均值 |
2.6 课堂完整代码
课堂代码文件:02_numpy入门使用.py
python
# 1.导包
import numpy as np
# 2.创建numpy数组
# 此处咱们用最简单的方式创建: 把列表转换为numpy数组
my_list = [[10, 20], [30, 40]]
print(my_list, type(my_list))
my_array = np.array(my_list)
print(my_array, type(my_array))
print('===================================')
# 3.数组的基础运算
# 下面的操作都是返回新的数组
print(my_array + 2)
print(my_array - 2)
print(my_array * 2)
print(my_array / 2)
print(np.max(my_array))
print(np.min(my_array))
print(np.sum(my_array))
print(np.mean(my_array))
# 还有很多计算的api,大家自己去研究
2.7 记忆口诀
NumPy 重点不是"表格",而是"数组";不是一行一行处理,而是批量计算。
3. Pandas 入门
3.1 Pandas 的定位
Pandas 主要用于:
- 数据分析
- 数据清洗
- 表格处理
- CSV / Excel 等文件读取
- 按行、按列、按标签处理数据
你可以把 Pandas 理解成:Python 中专门处理"表格数据"的工具库。
3.2 导包方式
python
import pandas as pd
通常约定把 pandas 简写为 pd。
3.3 Pandas 的两个核心对象
| 对象 | 可以理解为 | 特点 |
|---|---|---|
Series |
一列数据 | 一维,有索引,有名字 |
DataFrame |
一张表格 | 二维,有行索引和列名 |
3.4 创建 Series
python
my_list1 = [10, 20, 30, 40]
s = pd.Series(my_list1, name='nums')
Series 类似表格中的一列。
3.5 创建 DataFrame
一列数据:
python
df1 = pd.DataFrame(my_list1, columns=['nums1'])
多行多列数据:
python
my_list2 = [[10, 11], [20, 21], [30, 31], [40, 41]]
df2 = pd.DataFrame(my_list2, columns=['nums1', 'nums2'])
DataFrame 类似一张二维表。
3.6 Pandas 相比 NumPy 多了什么?
Pandas 比 NumPy 更适合处理"带业务含义的数据"。
例如:
python
df2['nums2']
这里不是按位置取数据,而是通过列名 nums2 取数据。
3.7 常用列统计
python
df2['nums2'].sum()
df2['nums2'].mean()
df2['nums2'].max()
df2['nums2'].min()
| 方法 | 作用 |
|---|---|
.sum() |
求和 |
.mean() |
平均值 |
.max() |
最大值 |
.min() |
最小值 |
3.8 课堂完整代码
课堂代码文件:03_pandas入门使用.py
python
# 1.导包
import pandas as pd
# 2.创建pandas对象
# 此处咱们用最简单的方式创建: 把列表转换为pandas对象
# 2.1 创建Series对象(类似一列)
my_list1 = [10, 20, 30, 40]
print(my_list1, type(my_list1))
s = pd.Series(my_list1, name='nums')
print(s, type(s)) # Series只能组成一列
# 2.2 创建DataFrame对象(类似表格)
my_list1 = [10, 20, 30, 40]
df1 = pd.DataFrame(my_list1, columns=['nums1'])
print(df1, type(df1)) # 类似表格中只有1列的情况
my_list2 = [[10, 11], [20, 21], [30, 31], [40, 41]]
print(my_list2, type(my_list2))
df2 = pd.DataFrame(my_list2, columns=['nums1', 'nums2'])
print(df2, type(df2)) # 类似表格中有4行2列
print('================================================')
# 3.pandas相比numpy多了行列索引和标签
# 需求: 获取df2的第2列
print(df2['nums2'])
# 需求: 获取df2的低2列的总和,平均,最大值,最小值
print(df2['nums2'].sum())
print(df2['nums2'].mean())
print(df2['nums2'].max())
print(df2['nums2'].min())
3.9 记忆口诀
NumPy 看数组位置,Pandas 看行列标签;Pandas 更像 Excel 表格。
4. Matplotlib 入门
4.1 Matplotlib 的定位
Matplotlib 主要用于:
- 数据可视化
- 折线图
- 柱状图
- 散点图
- 图表标题、图例、网格、坐标轴设置
你可以把 Matplotlib 理解成:Python 中最基础、最常用的画图工具库。
4.2 导包方式
python
import matplotlib.pyplot as plt
通常约定把 matplotlib.pyplot 简写为 plt。
4.3 常用绘图函数
| 函数 | 作用 |
|---|---|
plt.figure() |
创建画布 |
plt.plot(x, y) |
画折线图,默认就是折线图 |
plt.title() |
添加标题 |
plt.xlabel() |
添加 x 轴名称 |
plt.ylabel() |
添加 y 轴名称 |
plt.legend() |
添加图例 |
plt.grid() |
添加网格 |
plt.show() |
展示图像 |
4.4 中文乱码处理
课堂代码中使用:
python
plt.rcParams['font.sans-serif'] = ['SimHei']
作用:让图表标题、坐标轴中的中文能够正常显示。
4.5 matplotlib.use('TkAgg') 的作用
课堂代码中使用:
python
import matplotlib
matplotlib.use('TkAgg')
plt.rcParams['font.sans-serif'] = ['SimHei']
作用:解决个别环境下 plt.show() 无法弹出图像窗口的问题。
注意:如果你在 Jupyter Notebook 或某些服务器环境中运行,可能不需要这句,甚至可能需要删除它。
4.6 课堂完整代码
课堂代码文件:04_matplotlib入门使用.py
python
# 1.导包
import random
import matplotlib.pyplot as plt
# 解决个别版本show()无法展示图的问题
import matplotlib
matplotlib.use('TkAgg')
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 需求: 绘制每个月销量曲线图
# 2.准备测试数据
a = [i for i in range(1, 13)] # 12个月份
nums = [random.randint(0, 100) for i in a] # 每个月份对应的销量
# 3.绘图
# plt.plot()画图默认折线图
plt.plot(a,nums,color='red')
# 添加标题
plt.title('matplotlib入门案例')
# 添加坐标轴
plt.xlabel('月份')
plt.ylabel('销量')
# 添加网格
plt.grid()
# 展示图
plt.show()
4.7 代码执行流程
这个案例的流程是:
latex
1. 准备 1~12 月份
2. 随机生成每个月销量
3. 使用 plt.plot() 绘制折线图
4. 添加标题、坐标轴、网格
5. 使用 plt.show() 展示
4.8 记忆口诀
Matplotlib 不是处理数据的重点,它负责把已经处理好的数据"画出来"。
5. Python 数据分析三剑客核心对比
5.1 一张表看懂三剑客
| 工具 | 核心作用 | 典型对象 | 常见用途 | 类比 |
|---|---|---|---|---|
| NumPy | 数值计算 | ndarray |
数组、矩阵、批量运算 | 计算器 / 数组引擎 |
| Pandas | 数据处理 | Series / DataFrame |
表格、CSV、筛选、统计 | Excel / 数据表 |
| Matplotlib | 数据可视化 | 图像对象 / plt |
折线图、散点图、柱状图 | 画图工具 |
5.2 三者配合流程
latex
原始数据
↓
NumPy:生成数据 / 数值计算
↓
Pandas:整理成表格 / 统计分析
↓
Matplotlib:绘图展示
5.3 什么时候用谁?
| 场景 | 优先使用 |
|---|---|
| 我要创建数组、做批量数学计算 | NumPy |
| 我要读取 CSV、处理表格、按列统计 | Pandas |
| 我要把数据画成图 | Matplotlib |
| 我要做一个完整数据分析案例 | 三个一起用 |
6. 三剑客配合入门案例
6.1 案例需求
随机生成 5 个学生的 3 门课成绩,然后:
- 使用 NumPy 生成随机成绩数据
- 使用 Pandas 把数据整理成表格
- 统计每门学科总成绩
- 统计每个学生总成绩
- 使用 Matplotlib 画散点图
6.2 关键代码拆解
第一步:NumPy 生成数据
python
my_arr = np.random.randint(low=1, high=100, size=(5, 3))
含义:
low=1:随机数最小值从 1 开始high=100:随机数小于 100size=(5, 3):生成 5 行 3 列的数据
第二步:Pandas 转成表格
python
df = pd.DataFrame(
my_arr,
index=['张三', '李四', '王五', '赵六', '田七'],
columns=['语文', '英语', '数学']
)
含义:
- 行索引:学生姓名
- 列名:学科名称
- 表格内容:随机生成的成绩
第三步:按列求和
python
df.sum(axis=0)
axis=0 表示按列统计,得到每门学科的总成绩。
第四步:按行求和
python
df.sum(axis=1)
axis=1 表示按行统计,得到每个学生的总成绩。
第五步:画散点图
python
fig, ax = plt.subplots()
ax.scatter(x=df['语文'], y=df['数学'])
ax.set_title('综合案例')
plt.show()
表示把语文成绩作为 x 轴,数学成绩作为 y 轴,画出散点图。
6.3 课堂完整代码
课堂代码文件:05_三剑客配合入门使用.py
python
# TODO 1.导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 解决个别版本show()无法展示图的问题
import matplotlib
matplotlib.use('TkAgg')
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# TODO 2.numpy负责生成数据
# 此处用numpy随机生成1-100的多个数字,组成5行3列的数组
my_arr = np.random.randint(low=1, high=100, size=(5, 3))
print(my_arr)
print('------------------------------------------------------')
# TODO 3.使用pandas处理数据
df = pd.DataFrame(my_arr, index=['张三', '李四', '王五', '赵六', '田七'], columns=['语文', '英语', '数学'])
print(df)
print('------------------------------------------------------')
# 需求1: 获取各个学科的总成绩
# 方式1:一个个获取
print('语文', df['语文'].sum())
print('英语', df['英语'].sum())
print('数学', df['数学'].sum())
# 方式2: df整体获取
print(df.sum(axis=0)) # axis=0:按照列相加
print('===============================================')
# 需求2: 获取各个同学的总成绩
print(df.sum(axis=1)) # # axis=0:按照行相加
# TODO 4.matplotlib可视化数据
fig, ax = plt.subplots()
# 绘制散点图 注意: 下面数据是随便传的,未来根据具体需求决定x,y内容
ax.scatter(x=df['语文'], y=df['数学'])
ax.set_title('综合案例')
plt.show()
6.4 这个案例要掌握什么?
你需要重点掌握:
latex
NumPy 负责造数据
Pandas 负责整理数据
Pandas 负责统计数据
Matplotlib 负责画图
7. 中美日 GDP 数据处理综合案例
7.1 案例需求
读取 1960-2019全球GDP数据.csv,筛选出中国、美国、日本三个国家的 GDP 数据,并绘制每年变化折线图。
7.2 数据文件
课堂数据文件:
latex
data/1960-2019全球GDP数据.csv
数据前几行大致结构:
latex
year, country, GDP1960, 美国, 543300000000 1960, 英国, 73233967692 1960, 法国, 62225478000 1960, 中国, 59716467625 1960, 日本, 44307342950
这个 CSV 中主要有 3 列:
| 列名 | 含义 |
|---|---|
country |
国家 |
year |
年份 |
GDP |
GDP 数据 |
7.3 案例完整流程
latex
1. 导入 pandas 和 matplotlib
2. 使用 pd.read_csv() 读取 CSV 文件
3. 使用 df.shape / df.head() 等方法查看数据
4. 使用 dropna() 删除缺失值
5. 筛选中国、美国、日本三份数据
6. 把 year 设置为索引
7. 修改 GDP 列名,分别改成 中国、美国、日本
8. 使用 plt.plot() 绘制三条折线
9. 添加标题、图例、网格
10. 使用 plt.show() 展示图像
7.4 读取 CSV
python
df = pd.read_csv('data/1960-2019全球GDP数据.csv', encoding='gbk', sep=',')
参数解释:
| 参数 | 作用 |
|---|---|
'data/1960-2019全球GDP数据.csv' |
CSV 文件路径 |
encoding='gbk' |
文件编码是 GBK,避免中文乱码 |
sep=',' |
CSV 使用逗号分隔 |
7.5 查看数据基本信息
python
print(df.shape)
print(df.head())
print(df.tail())
print(df.columns)
df.info()
常用方法:
| 方法 | 作用 |
|---|---|
df.shape |
查看行数和列数 |
df.ndim |
查看维度 |
df.head() |
查看前 5 行 |
df.tail() |
查看后 5 行 |
df.columns |
查看所有列名 |
df.count() |
查看各列非空数量 |
df.info() |
查看整体信息 |
7.6 删除缺失值
python
df.dropna(inplace=True)
含义:删除带有空值的行。
inplace=True 表示直接在原来的 df 上修改。
7.7 筛选指定国家
python
df_cn = df[df['country'] == '中国']
df_us = df[df['country'] == '美国']
df_jp = df[df['country'] == '日本']
这是 Pandas 中非常重要的条件筛选写法。
可以读成:
latex
从 df 中筛选 country 列等于 中国 / 美国 / 日本 的数据
7.8 设置年份为索引
python
df_cn.set_index('year', inplace=True)
df_us.set_index('year', inplace=True)
df_jp.set_index('year', inplace=True)
这样后面画图时,x 轴就可以使用年份。
7.9 修改列名
python
df_cn.rename(columns={"GDP": "中国"}, inplace=True)
df_us.rename(columns={"GDP": "美国"}, inplace=True)
df_jp.rename(columns={"GDP": "日本"}, inplace=True)
这样每条线的数据列名更清晰。
7.10 绘制折线图
python
plt.title('1960-2019年中美日GDP数据折线图')
plt.plot(df_cn.index, df_cn['中国'], label='中国', color='red')
plt.plot(df_us.index, df_us['美国'], label='美国', color='blue')
plt.plot(df_jp.index, df_jp['日本'], label='日本', color='green')
plt.legend()
plt.grid()
plt.show()
重点理解:
python
plt.plot(x轴数据, y轴数据, label='图例名称')
例如:
python
plt.plot(df_cn.index, df_cn['中国'], label='中国')
表示:
latex
x轴:年份
y轴:中国 GDP
图例:中国
7.11 课堂完整代码
课堂代码文件:06_中美日三个国家的GDP数据每年变化折线图.py
python
# TODO 需求: 获取中美日三个国家GDP数据,并绘制每年变化折线图
# 1.导包
import matplotlib.pyplot as plt
import pandas as pd
# 解决个别版本show()无法展示图的问题
import matplotlib
matplotlib.use('TkAgg')
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 2.读取数据
# 注意: 以后用的多的就是通过读取文件,生成df对象
df = pd.read_csv('data/1960-2019全球GDP数据.csv', encoding='gbk', sep=',')
# 3.先了解数据
print(df.shape) # 形状(9931, 3)
# print(df.ndim) # 维度
# print(df.head()) # 如果不传递参数,默认是5
# print(df.tail()) # 如果不传递参数,默认是5
# print(df.columns) # 获取所有列名
# print(df.count()) # 各个列的个数
# df.info() # 基本信息
# 4.数据预处理
df.dropna(inplace=True)
print(df.shape) # 形状(9930, 3)
# 5.数据分析
# todo 需求1: 先查询中美日的gdp数据
df_cn = df[df['country'] == '中国']
df_us = df[df['country'] == '美国']
df_jp = df[df['country'] == '日本']
# 测试
# print(df_cn.head())
# print(df_us.head())
# print(df_jp.head())
# todo 需求2: 把年份作为索引列
df_cn.set_index('year', inplace=True)
df_us.set_index('year', inplace=True)
df_jp.set_index('year', inplace=True)
# 测试
# print(df_cn.head())
# print(df_us.head())
# print(df_jp.head())
# todo 需求3: 把GDP列名依次修改为中国,美国,日本
df_cn.rename(columns={"GDP": "中国"}, inplace=True)
df_us.rename(columns={"GDP": "美国"}, inplace=True)
df_jp.rename(columns={"GDP": "日本"}, inplace=True)
# 测试
# print(df_cn.head())
# print(df_us.head())
# print(df_jp.head())
# todo 需求4: 可视化展示中美日的每年变化折线
plt.title('1960-2019年中美日GDP数据折线图')
plt.plot(df_cn.index, df_cn['中国'], label='中国', color='red')
plt.plot(df_us.index, df_us['美国'], label='美国', color='blue')
plt.plot(df_jp.index, df_jp['日本'], label='日本', color='green')
# 添加图例
plt.legend()
# 添加网格
plt.grid()
# 手动展示
plt.show()
7.12 这个综合案例的核心能力
这个案例不是为了记住 GDP 数据,而是为了掌握一套数据分析通用流程:
latex
读取数据 → 观察数据 → 清洗数据 → 筛选数据 → 整理索引/列名 → 画图展示
以后你处理 Excel、CSV、日志统计、测试结果分析时,也可以套这个流程。
8. 本章必须记住的 Pandas / Matplotlib API
8.1 Pandas 必记 API
| API | 作用 |
|---|---|
pd.Series() |
创建一列数据 |
pd.DataFrame() |
创建表格数据 |
pd.read_csv() |
读取 CSV 文件 |
df.shape |
查看行列数 |
df.head() |
查看前几行 |
df.tail() |
查看后几行 |
df.columns |
查看列名 |
df.info() |
查看整体信息 |
df.dropna() |
删除缺失值 |
df.set_index() |
设置索引列 |
df.rename() |
修改列名 |
df.sum() |
求和 |
df.mean() |
平均值 |
df.max() |
最大值 |
df.min() |
最小值 |
8.2 Matplotlib 必记 API
| API | 作用 |
|---|---|
plt.plot() |
折线图 |
ax.scatter() |
散点图 |
plt.title() |
标题 |
plt.xlabel() |
x 轴名称 |
plt.ylabel() |
y 轴名称 |
plt.legend() |
图例 |
plt.grid() |
网格 |
plt.show() |
展示图片 |
9. 常见易错点
9.1 axis=0 和 axis=1 容易混

9.2 读取中文 CSV 容易乱码
如果 CSV 是中文编码,可能需要:
python
encoding='gbk'
如果是 UTF-8 文件,则可能需要:
python
encoding='utf-8'
9.3 inplace=True 表示原地修改
例如:
python
df.dropna(inplace=True)
表示直接修改 df 本身,不再返回一个新的 DataFrame。
9.4 plt.show() 不显示图
可以尝试课堂代码中的:
python
import matplotlib
matplotlib.use('TkAgg')
但在 Jupyter、VSCode、服务器环境中,这句不一定适用,需要根据运行环境调整。
10. 建议练习
10.1 NumPy 练习
- 创建一个 3 行 4 列的随机数组。
- 求数组最大值、最小值、总和、平均值。
- 对数组整体加 10、乘 2。
10.2 Pandas 练习
- 用学生姓名、语文、数学、英语成绩创建一个 DataFrame。
- 求每个学生总分。
- 求每门课平均分。
- 找出数学成绩最高的学生。
10.3 Matplotlib 练习
- 画每个月销量折线图。
- 给图添加标题、x 轴、y 轴、网格。
- 尝试画两条折线,并添加图例。
10.4 综合练习
基于 GDP 案例,尝试修改代码:
- 只画中国 GDP。
- 增加德国、英国、法国的数据。
- 改成柱状图。
- 只显示 2000 年以后的数据。