Python 数据分析入门:从脏数据到可视化,四大流程全解析
前言
什么是数据分析?通俗来说,就是给你一堆杂乱无章的原始数据,通过清洗、分析、可视化等一系列手段,从中挖掘出有价值的信息和结论,最终解决实际问题。
对于很多刚接触数据分析的同学来说,面对一堆“脏数据”往往不知道从何下手。本文将带你系统梳理数据分析的四大基本流程,并结合 Python 中两个核心库——Pandas 和 Matplotlib,帮助你快速入门,建立起完整的数据分析知识框架。
💬 开课小互动:你第一次听说“数据分析”这个词是在什么场景?是想做报表、写论文,还是单纯觉得数据科学家很酷?欢迎在评论区聊聊你的故事!
一、数据分析的四大基本流程
来,跟我一起说一遍:收集 → 清洗 → 分析 → 可视化。
| 步骤 | 名称 | 说明 |
|---|---|---|
| 1 | 数据收集 | 从数据库、爬虫、API、Excel 等渠道获取原始数据(通常是“脏数据”)。 |
| 2 | 数据清洗 | 处理缺失值、重复值、异常值,统一数据格式,获得干净可用的数据。 |
| 3 | 数据分析 | 通过筛选、排序、分组、聚合等手段,提取有价值的信息。 |
| 4 | 数据可视化 | 将分析结果以图表形式呈现,让数据“会说话”,便于决策和汇报。 |
✍️ 动笔思考:这四步中,你觉得哪一步最耗时?有经验的同学都知道,数据清洗往往占据 80% 的时间。你认同吗?可以在评论区打出你的答案。
二、数据分析的利器:Jupyter Notebook
在正式开始之前,先给大家推荐一个工具——Jupyter Notebook。
它是一个基于 Web 的交互式编程笔记本,可以让你把代码、运行结果、图表、笔记全部整合在一个文件里,特别适合数据分析这种需要反复调试、可视化输出的场景。
常用快捷键速查:
| 快捷键 | 功能 |
|---|---|
Ctrl + Enter |
运行当前代码块 |
Shift + Enter |
运行当前代码块并在下方新建 |
💡 小建议:如果你还在用 PyCharm 跑一段注释一段,不妨试试 Jupyter Notebook,会打开新世界的大门。你用过了吗?评论区说说你的体验。
三、数据清洗与处理:Pandas 库入门
数据分析的第二步(也是重头戏)就是数据清洗与处理,这里我们用到的主角是 Pandas。
Pandas 是基于 NumPy 构建的强大数据分析工具集,其核心是两个数据结构:
3.1 核心数据结构:DataFrame 与 Series
很多同学容易把这两个搞混,我教大家一个类比记忆法:
| Pandas | MySQL 数据库 | 说明 |
|---|---|---|
| DataFrame | Table(表) | 二维数据框架 |
| Series | Column(列) | 一维数据列 |
🧠 互动联想:把 DataFrame 想象成一张 Excel 表格,Series 就是表格中的某一列。每行前面还有一个隐藏的
index(索引),记住了吗?
3.2 构建 DataFrame
常用方式:列表嵌套 + 指定列名
import pandas as pd
df = pd.DataFrame([
['张三', 85, 92, 78],
['李四', 78, 88, 95],
['王五', 92, 96, 89]
], columns=['姓名', '语文', '数学', '英语'], index=['a', 'b', 'c'])
注意: 每行嵌套列表中的值的数量必须和列数一致,否则会报错。
3.3 DataFrame 常用属性速查
以下都是属性,不是函数,所以不要在后面加 ():
| 属性 | 说明 |
|---|---|
df.columns |
获取列名 |
df.values |
获取数据值 |
df.size |
获取单元格总数 |
df.index |
获取索引列 |
df.dtypes |
获取每一列的数据类型 |
df.shape |
获取数据维度(行数, 列数) |
🔍 动手试试:用上面的代码创建
df后,分别打印df.shape和df.columns,看看输出结果是什么?
3.4 构建 Series
最常用方式:字典构建
s3 = pd.Series({'a': 10, 'b': 20, 'c': 30, 'd': 40, 'e': 50})
Series 除了没有 columns 属性外,其余属性和 DataFrame 类似。
四、数据的读写操作
Pandas 支持多种格式的数据读取与写入,格式统一好记:读用 read_,写用 to_。
4.1 读取 CSV 文件(指定列)
df = pd.read_csv('data/students.csv', usecols=['学号', '姓名', '性别'])
usecols 参数用于指定只读取某些列,非常适合字段多的大文件。
4.2 写入 CSV 文件
df.to_csv('data/students_01.csv', index=False)
index=False 表示不写入隐藏索引列,否则 CSV 文件会多出一列无用的序号。
🧪 小挑战:找一个你本地有的 CSV 文件,试着用
pd.read_csv()读取,并指定usecols只看前 3 列。成功了吗?有问题欢迎评论区交流。
五、数据处理:查看、选择与过滤
拿到数据后,我们需要对数据进行查看、选择和过滤,这一步和 MySQL 的 SELECT + WHERE 非常相似。
5.1 数据查看
| 函数/属性 | 说明 |
|---|---|
df.head(n) |
查看前 n 行数据,默认 5 行 |
df.tail(n) |
查看末尾 n 行数据,默认 5 行 |
df.describe() |
数值列的统计描述(均值、标准差等) |
df.info() |
查看数据信息(列名、非空数、类型) |
df.shape |
查看数据维度 |
df.columns |
查看列名 |
5.2 数据选择
| 语法 | 说明 |
|---|---|
df['列名'] 或 df.列名 |
选择单列 |
df[['列1', '列2']] |
选择多列 |
df.iloc[start:stop:step] |
基于行号切片(不含stop) |
df.loc[start:stop:step] |
基于索引标签切片(含stop) |
⚠️ 重点区分:
iloc用行号(隐藏的,不可更改),loc用索引标签(可自定义)。两者不是一回事,别搞混了!
5.3 数据过滤
过滤条件的写法和 MySQL 的 WHERE + AND/OR 非常像:
# 单条件:销售数量 >= 10
df[df['销售数量'] >= 10]
# 单条件:产品类别属于服装或食品
df[df['产品类别'].isin(['服装', '食品'])]
# 单条件:单价在 50 到 200 之间
df[df['单价'].between(50, 200)]
# 多条件组合:&(且)、|(或)
df[(df['销售数量'] >= 10) & (df['单价'] < 100)]
六、数据清洗:缺失值、重复值、异常值
数据清洗是数据分析中最耗时的环节,主要包括处理缺失值、重复值、异常值和格式统一。
6.1 缺失值处理
查看缺失值:
df.isnull() # 返回布尔型的 DataFrame,标记所有缺失位置
删除缺失值:
df.dropna() # 删除缺失值所在行
df.dropna(axis=1) # 删除缺失值所在列
填充缺失值:
df.fillna('--') # 用指定值填充
df.ffill() # 用上一行数据填充
df.bfill() # 用下一行数据填充
6.2 重复值处理
查看重复值:
df.duplicated() # 所有列都重复才算重复
df.duplicated(subset=['学号']) # 指定列重复即算重复
删除重复值:
df.drop_duplicates(subset=['订单号']) # 默认保留第一行
df.drop_duplicates(subset=['订单号'], keep='last') # 保留最后一行
6.3 异常值处理
查看异常值:
df[df['年龄'] < 18] # 找出年龄小于 18 的异常数据
删除异常值:
df.drop(df[df['年龄'] < 18].index) # 删除异常值所在行
修复异常值(如取绝对值、替换等)需根据具体业务场景操作。
6.4 数据格式处理
对于字符串列,可通过 .str 进行链式操作,实现格式统一:
df['姓名'].str.strip() # 去除两端空格
df['日期'].str.replace() # 替换特定字符
📝 课后思考:回忆一下,数据清洗四个子任务分别是什么?缺失值、重复值、异常值、格式处理。能不看笔记说出来吗?
七、数据排序与分组
7.1 数据排序
和 MySQL 的 ORDER BY 类似:
# 单列排序:按年龄降序
df.sort_values('年龄', ascending=False)
# 多列排序:先按年龄升序,相同年龄再按学分降序
df.sort_values(['年龄', '学分'], ascending=[True, False])
7.2 数据分组与聚合
和 MySQL 的 GROUP BY + 聚合函数对应:
# 按年龄分组,统计学分的 sum、count、max、min、mean
df.groupby('年龄')['学分'].agg(['sum', 'count', 'max', 'min', 'mean'])
🎯 动手挑战:用你手头的数据,试着按某个字段分组,算出各组的平均值和总和。把代码截图发在评论区,看看大家的写法有什么不同!
八、数据可视化:Matplotlib 入门
数据分析的最后一步,就是把结果画出来,让人一目了然。Python 中最常用的绘图库就是 Matplotlib。
8.1 快速上手:画一张折线图
import matplotlib.pyplot as plt
import random
# 设置中文字体(否则中文会显示方块)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 准备数据
x = [i for i in range(1, 25)]
y_bj = [random.randint(10, 15) for i in x]
y_xa = [random.randint(13, 18) for i in x]
# 创建画布
plt.figure(figsize=(10, 5))
# 画折线图
plt.plot(x, y_bj, label='北京')
plt.plot(x, y_xa, label='西安')
# 美化细节
plt.title('气温变化折线图', fontsize=15) # 标题
plt.xlabel('时间') # X 轴标签
plt.ylabel('温度') # Y 轴标签
plt.xticks(x) # X 轴刻度
y_ticks = [i for i in range(5, 21)]
plt.yticks(y_ticks) # Y 轴刻度
plt.grid(linestyle='--', alpha=0.3) # 网格线
plt.legend(loc='upper right') # 图例
# 显示图表
plt.show()
画图通用原则:先跑起来,再美化。 先把基础图画出来,再逐步添加标题、标签、网格等细节。
8.2 一张画布,多个子图
实际项目中,经常需要在一张画布上展示多个图表:
# 创建 1 行 2 列的子图布局
figure, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 6), dpi=100)
# 在第一个子图画折线图
axes[0].plot(x, y_bj, label='北京')
# 在第二个子图画柱状图
axes[1].bar(x, y_xa, label='西安')
axes[0] 和 axes[1] 分别对应两个子图对象,通过索引操作不同的子图。
8.3 三种常用图表类型
| 图表类型 | 函数 | 适用场景 |
|---|---|---|
| 折线图 | plot(...) |
展示趋势变化 |
| 柱状图 | bar(...) |
展示数量对比 |
| 饼状图 | pie(...) |
展示比例构成 |
🎨 创意挑战:用 Matplotlib 把你的学习时长画成一张折线图,或者把本月各项支出画成饼状图。画好之后欢迎在评论区晒图,看看谁是“数据可视化大师”!
九、总结:一张图回顾全部知识点
| 流程步骤 | 主要任务 | 核心工具/库 |
|---|---|---|
| 1. 数据收集 | 从各种渠道获取原始数据(脏数据) | 爬虫、API、Excel |
| 2. 数据清洗 | 处理缺失值、重复值、异常值、格式 | Pandas |
| 3. 数据分析 | 查看、选择、过滤、排序、分组、聚合 | Pandas |
| 4. 数据可视化 | 绘制折线图、柱状图、饼状图等 | Matplotlib |
理论是基础,实践出真知。今天讲的每一个知识点,课后都要动手敲一遍代码,才能真正变成自己的技能。数据不会自己说话,但你可以让它“开口”。
🎤 结课小调查:学完本文后,你觉得最难啃的骨头是哪一块?
A. Pandas 数据处理
B. Matplotlib 可视化
C. 正则表达式(数据清洗)
D. Jupyter Notebook 使用在评论区打出你的选项,我会根据呼声最高的话题,考虑出一篇深度详解!
本文为 Python 数据分析入门理论授课内容整理,后续可继续推出实战案例文章。如果觉得有帮助,欢迎点赞、收藏、关注,您的支持是我持续输出的动力!
更多推荐
所有评论(0)