五、数据处理1

0. 本章学习目标

学完本章,你需要能回答 4 个问题:

  1. NumPy 是干什么的?
    用来做高效数值计算,核心对象是数组 ndarray
  2. Pandas 是干什么的?
    用来做数据分析和处理,核心对象是 SeriesDataFrame
  3. Matplotlib 是干什么的?
    用来做数据可视化,把数据画成折线图、散点图、柱状图等。
  4. 三剑客如何配合?
    一般流程是: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 + 鼠标左键 点击 numpypandasmatplotlib,能跳转源码或库定义,说明导包成功。


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 门课成绩,然后:

  1. 使用 NumPy 生成随机成绩数据
  2. 使用 Pandas 把数据整理成表格
  3. 统计每门学科总成绩
  4. 统计每个学生总成绩
  5. 使用 Matplotlib 画散点图

6.2 关键代码拆解

第一步:NumPy 生成数据
python 复制代码
my_arr = np.random.randint(low=1, high=100, size=(5, 3))

含义:

  • low=1:随机数最小值从 1 开始
  • high=100:随机数小于 100
  • size=(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=0axis=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 练习

  1. 创建一个 3 行 4 列的随机数组。
  2. 求数组最大值、最小值、总和、平均值。
  3. 对数组整体加 10、乘 2。

10.2 Pandas 练习

  1. 用学生姓名、语文、数学、英语成绩创建一个 DataFrame。
  2. 求每个学生总分。
  3. 求每门课平均分。
  4. 找出数学成绩最高的学生。

10.3 Matplotlib 练习

  1. 画每个月销量折线图。
  2. 给图添加标题、x 轴、y 轴、网格。
  3. 尝试画两条折线,并添加图例。

10.4 综合练习

基于 GDP 案例,尝试修改代码:

  1. 只画中国 GDP。
  2. 增加德国、英国、法国的数据。
  3. 改成柱状图。
  4. 只显示 2000 年以后的数据。

相关推荐
鱼毓屿御1 小时前
Python 装饰器与函数调用机制(复习笔记 · 2026-07-07)
开发语言·python
AC赳赳老秦2 小时前
采购专员自动化:OpenClaw 自动比价、生成询价单、跟踪供应商报价进度实战指南
开发语言·数据库·人工智能·python·自动化·github·openclaw
ednO8nqdR2 小时前
Python小游戏制作:如何实现可配置的跨分辨率界面布局
python·plotly·django·virtualenv·scikit-learn·fastapi·pygame
林泽毅2 小时前
Qwen3.5 DPO 模型对齐实战(pytrio训练版)
人工智能·python·算法
荣码2 小时前
LangGraph多步工作流:Agent不够用的时候,我踩了4个坑
java·python
曲幽2 小时前
从卡顿到丝滑:FastAPI 调用外部 API 的正确姿势(httpx 实战)
python·fastapi·web·async·httpx·client·await·requests·aiohttp
不瘦80斤不改名2 小时前
HalfCart:基于LBS的1\.5km本地拼单系统全栈实践与踩坑复盘
python·docker·typescript·pycharm
深盾科技_Virbox3 小时前
软件交付保护如何从加壳走向代码虚拟化
java·python·安全
YUS云生3 小时前
Python学习笔记·第28天:Git入门——版本控制与基础操作
笔记·python·学习