news 2026/10/10 4:35:26

Python数据分析零基础入门:从环境搭建到数据清洗与可视化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python数据分析零基础入门:从环境搭建到数据清洗与可视化

“Python零基础”系列写到第14篇,今天聊聊数据分析。很多初学者一听“数据分析”四个字就发怵,觉得得先学一堆数学、统计知识才行,其实真不是这样。数据分析用大白话讲就四步:拿到一堆数据、把数据弄干净、找出里面的规律、把规律画成图给别人看。Python在这四步里几乎都有现成工具,零基础的人完全可以直接上手。这篇文章我会用一套完整的实操流程,带你从安装环境开始,到读入数据、清洗数据、统计计算、最后可视化成图表,每个环节都给出可以直接复制的代码和运行效果,以及我在实际教学中反复跟学员强调的那些坑。

这个系列适合谁呢?如果你完全没写过代码,那建议先把前13篇的基础语法过一遍,不需要精通,能看懂if、for、函数就够了;如果你已经零星写过一点Python,但对数据分析一头雾水,那这篇文章可以直接照做。我会尽量把每个“为什么要这么写”都讲清楚,而不是丢给你一堆命令让你死记硬背。

1. 数据分析到底在做什么

1.1 先建立工作流概念

我见过太多初学者拿起一本书就开始敲代码,敲了三个小时发现不知所以然,最后放弃了。问题不出在代码,出在他脑子里没有一幅“地图”。

数据分析完整的工作流其实是固定的,不管什么行业、什么数据规模,基本都是这样一个闭环:

  1. 获取数据:从本地文件、数据库或者接口拿到原始数据。
  2. 清洗数据:处理缺失值、重复值、格式错误,这步最耗时,通常占整个工作量的六到七成。
  3. 探索分析:用统计方法看数据的分布、聚合、趋势,比如求平均、分组统计。
  4. 可视化呈现:把分析结果画成图表,让结论一目了然。
  5. 输出结论:写报告也好,做PPT也好,落到业务决策上。

当你脑子里有了这五步,再来看Python里的各种库就非常清晰了:pandas负责第2步和第3步,matplotlib和seaborn负责第4步,第1步和第5步因人而异。这样学习就有了方向感,不会再迷失在语法细节里。

1.2 零基础为什么首选Python

有人会问:数据分析为什么不用Excel?为什么不用R语言?我个人的看法是:Excel适合处理几千行的数据,数据量一旦过万,公式卡得要命,操作步骤也很难记录复盘;R语言统计功能很强,但对编程零基础的人来说语法不够平易近人。

Python胜在“生态统一”。从爬虫获取数据、到pandas做清洗、再到画图展示,全在一门语言里搞定,学了不浪费。而且社区资料极多,你遇到任何报错,只要把错误信息复制到搜索引擎里,几乎都能找到解决方案。这种“遇到问题能查到答案”的特性,对零基础学员来说是最大的安全感。

我经常跟学员打比方:学数据分析不像是学数学,更像是学做饭。语法顶多是“认识厨房里的锅碗瓢盆”,而工作流是“做菜的顺序”。你不需要把所有厨具的说明书都背下来,只要有几道拿手菜,每做一次熟练一分,慢慢就会了。这篇文章就相当于带着你做一道完整的家常菜。

2. 环境准备和工具选型

2.1 用Anaconda还是原生Python

很多零基础学员在这第一步就卡住了,卡在“到底装哪个”。我直接给结论:如果你目标是数据分析,请直接安装Anaconda。原因有三个:

  • 它自带pandas、numpy、matplotlib这些数据分析常用库,省去了一一安装的麻烦。
  • 它自带Jupyter Notebook,这是数据分析场景下非常好用的交互式编辑器,写一段看一段结果,非常符合“边试边学”的节奏。
  • 环境管理工具conda可以帮你轻松创建隔离的开发环境,万一项目之间依赖冲突了也不怕。

安装版本建议选择Python 3.x的64位版本,不要安装奇怪的beta版。装完之后,在系统命令行或Anaconda Prompt里输入python --version,能看到版本号就说明安装成功。

我遇到过不少学员在安装环节就放弃了,原因大多是网速慢或者安装路径里带了中文。这里特别提醒一点:Anaconda安装路径尽量不要有中文和空格,否则后面运行一些库可能莫名其妙报路径错误。这是我踩过多次坑的教训。

2.2 Jupyter Notebook的操作习惯

Jupyter Notebook在数据分析场景下几乎是标配,它的核心交互逻辑是“单元格”。你可以在一个格子里写代码,然后按Shift + Enter运行,运行结果直接显示在代码下方,非常直观。

我的建议是养成几个好习惯:

  • 第一个格子永远用来写导入语句,比如import pandas as pd,这样每次重新运行时,所有依赖都从顶部开始加载,不会出现“变量已定义但找不到”的诡异错误。
  • 给每个分析阶段建一个Markdown标题单元格,相当于给自己的工作流加索引,方便回头查看。
  • 每运行完一步就保存一次(Ctrl + S),Jupyter偶尔会崩溃,不保存的损失只有自己知道。

有一个坑值得单独说:Jupyter里单元格的上下是有依赖关系的。如果你随手删除中间某个单元格,后面的单元格再运行时提示“xxx not defined”,问题不一定出在语法,而是前面某一步的结果没跑过。这时候直接从菜单栏选择“Kernel -> Restart & Run All”,整个文档从头到尾重新执行一遍,就能排查掉绝大多数这类问题。

2.3 验证核心库是否可用

环境装好后,强烈建议先做一个小验证,而不是直接冲进业务代码。打开Jupyter Notebook,新建一个文档,执行以下代码:

import pandas as pd import numpy as np import matplotlib.pyplot as plt print(pd.__version__) print(np.__version__) print("环境就绪")

如果三行代码都能正常输出,说明你的环境已经完全满足数据分析的基础要求。这一步障排得非常关键,因为很多网络教程默认你已经装好了库,直接开始讲demo,等你复现时才发现环境有问题,你还会以为是自己代码写错了,其实根本不是。

3. 零基础必懂的pandas核心数据结构

3.1 Series和DataFrame怎么理解

到了关键环节了。pandas里有两个核心对象,一个是Series,一个是DataFrame。把它们理解成Excel的概念就特别好懂:

  • Series相当于一列数据,带有索引,你可以把它看成一维数组的升级版。
  • DataFrame相当于一张完整的表格,它有行和列,每一列都可以是不同类型的值。操作DataFrame是数据分析里最高频的动作。

我教零基础学员的时候,总爱引用一个生活化类比:DataFrame就像是一个班级的花名册,每一行是一个学生,每一列是学生的一个属性(姓名、分数、年龄),而列名就是表头。所有常见的操作,比如筛选某几个学生、算全班平均分、按性别分组统计,都能用pandas一行命令完成。

创建DataFrame最简单的办法是传入一个字典,字典里面的每个键对应一列。比如:

import pandas as pd data = { '姓名': ['A同学', 'B同学', 'C同学'], '成绩': [88, 92, 79], '性别': ['女', '男', '女'] } df = pd.DataFrame(data) print(df)

执行后你会看到一张整齐的三行三列表格,这比用纯Python列表硬拼数据方便太多了。

3.2 从文件读入数据

现实中数据大多不在Python里,而在CSV、Excel文件或者数据库里。对于零基础学员,碰得最多的就是CSV文件。

读CSV用read_csv函数,一行搞定:

df = pd.read_csv('sales_data.csv')

但实际从来没有这么顺利过。三个最常见的问题是:

  • 文件路径不对,报FileNotFoundError。
  • 文件编码不对,报UnicodeDecodeError。
  • 列名不是默认的英文,需要指定header参数。

路径问题建议处理方法统一为:把数据文件和Notebook放在同一个文件夹下,然后只用文件名引用,不写完整路径,这样文件移动了也能正常打开。编码问题最常见的是UTF-8和GBK之间切换,报错了就尝试指定encoding='gbk'或encoding='utf-8',来回试一两次就能解决。列名问题用pd.read_csv('xxx.csv', header=0),如果文件本身没有表头,再补names=['列1', '列2', ...]。

3.3 数据预览三板斧

拿到数据之后,不要急着分析和“跑模型”。任何靠谱的分析流程,都要先“看看数据长什么样”。我习惯用三板斧:

# 查看前5行 print(df.head()) # 查看数据整体信息 print(df.info()) # 查看数值列的统计描述 print(df.describe())

head()让你直观看到数据的表头和前几行内容,马上能发现列名是否合理、数据格式是否统一。info()会告诉你每一列的数据类型、有没有缺失值,这是后续清洗的重要依据。describe()针对数值列输出均值、标准差、最小值、最大值、四分位数,快速了解数据分布。

这三个命令永远是数据分析师最常用的“开场动作”,花两分钟扫一眼,后面少走半小时弯路。

4. 手把手做一个完整的数据分析小项目

4.1 项目背景和数据说明

环境、工具、基础概念都讲完了,接下来咱们动真格。用一个虚拟的案例来演示完整闭环。

我创建了一个模拟项目X的数据集,叫course_sales.csv,它模拟的是某学习平台的课程订单记录,包含大约500行的销售数据。字段如下:

字段名含义类型
order_id订单编号字符串
course_name课程名称字符串
category课程分类字符串
price实际支付金额浮点数
user_city用户所在城市字符串
order_date下单日期字符串
pay_status支付状态字符串

这个数据集是我故意设计的,里面藏了几类典型脏数据:有空值、有重复订单、有格式不统一的日期、有状态写错的记录。真实的业务数据只会比这更乱,不会更干净,所以这个练习非常值得做。

任务目标是:统计各课程分类的销售总金额和订单量,找出销售额最高的top 5课程,并通过图表展示最近三个月的销售趋势。这套任务覆盖了清洗、聚合、可视化三类核心能力,做一遍之后,你基本可以处理工作中七八成的简单分析需求。

4.2 读入数据并进行初步探索

首先把文件读进来,然后做三板斧预览:

import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('course_sales.csv') print(df.head()) print(df.info())

通过info()我发现在order_date列有少量缺失值,price列存在非数值类型的记录,order_id出现了重复。同时多条记录的支付状态写法不一致,有的写“已完成”,有的简写成“完成”。如果这些数据不处理,后面统计出来的数字就是错的,结论也不可信。

这里我想强调一个观念:数据分析里,数据清洗比分析算法更重要。你花80%的时间处理数据,剩下20%的时间做统计和画图,这是常态。很多零基础学员总幻想拿到数据就能直接分析,结果做出来的图自己都不敢信,问题根源就在清洗没做干净。

我先把预览结果和清洗目标整理成了一个待办清单,这样思路就清晰了:

  • 处理price列的非数值记录。
  • 解决order_date缺失值。
  • 删除order_id重复行。
  • 统一pay_status的文本规范。

4.3 数据清洗:缺失值和重复值处理

先说重复值。用duplicated()判断重复行,用drop_duplicates()去除:

# 检测重复订单 duplicate_mask = df.duplicated(subset='order_id', keep=False) print(f"重复记录数: {duplicate_mask.sum()}") # 删掉重复行,保留第一条 df = df.drop_duplicates(subset='order_id', keep='first') print(f"去重后总行数: {len(df)}")

删除重复值的目标是为了让每条订单在统计中只被计算一次。如果不做这步,销售额会虚高,这是最基础但最重要的一步。

然后是缺失值。缺失值的处理方式取决于业务含义。对于order_date这种关键字段,如果缺失了,我的处理方案是直接删除这些行,而不是强行填充一个假日期。因为日期是订单的核心属性,填一个假日期会让趋势统计失真。如果只是某个不关键字段缺失,可以考虑填充默认值,但日期不建议这么做。

# 删除下单日期为空的行 df = df.dropna(subset=['order_date']) print(f"删缺失后总行数: {len(df)}")

关于price列,我们发现的是非数值记录,比如它可能被读成了字符串。先看看问题数据:

# 检查price列的非数字记录 price_issue = pd.to_numeric(df['price'], errors='coerce') print(df[pd.isna(price_issue)])

pd.to_numeric能把字符串转成数字,转换不了的就变成NaN。这里的思路是先用errors='coerce'做一次“体检”,把转换失败的行打印出来看具体内容。看完后再决定是删除还是根据业务做其他处理。如果问题是“数字带了后缀符号”之类,那就用替换修正;如果是完全没意义的记录,就直接删除。模拟项目X里我直接删除了转换失败的行。

统一支付状态的写法,用replace替换:

df['pay_status'] = df['pay_status'].replace({'完成': '已完成', '已付款': '已完成'}) print(df['pay_status'].value_counts())

到这里,数据已经在形态上“干净”了,可以进入统计环节。

4.4 分组统计和透视表应用

清洗完毕,先做分组统计。任务里要统计各课程分类的销售总金额和订单量,这用groupby聚合最合适:

category_stats = df.groupby('category').agg( 订单量=('order_id', 'count'), 销售总额=('price', 'sum') ).reset_index() print(category_stats.sort_values('销售总额', ascending=False))

groupby('category')是按分类分组,agg是同时做多个聚合计算:订单量算count,销售总额算sum。这里agg接收一个字典或更清晰的命名方式(如示例所示),直接生成一列叫“订单量”、一列叫“销售总额”的汇总表。这就是数据分析师最核心的“算数”动作,逻辑非常简单——分组、聚合。

接下来找销售额top 5的课程。先按course_name分组汇总,再排序取前5:

course_stats = df.groupby('course_name')['price'].sum().sort_values(ascending=False).head(5) print(course_stats)

这行代码属于pandas里非常经典的一行式链式调用:先分组,再取price列求和,然后排序,最后取前5。代码虽然短,但每一步都值得拆开理解。

如果你想同时看不同城市、不同分类交叉的销售情况,可以用pivot_table透视表:

pivot = pd.pivot_table( df, values='price', index='user_city', columns='category', aggfunc='sum', fill_value=0 ) print(pivot.head())

pivot_table相当于Excel的数据透视表,它把user_city放在行、category放在列,交叉格子里放销售额。fill_value=0的意思是没有销售额的交叉位置补0,避免报表里一堆NaN看着心烦。

4.5 用matplotlib做可视化

数字表格算完了,但不够直观,领导要看的往往是图。Python基础可视化最常用matplotlib,配合pandas画图会更顺手。

先做各分类销售额占比柱状图:

import matplotlib.pyplot as plt import matplotlib as mpl # 解决中文显示问题 mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['axes.unicode_minus'] = False category_stats.plot(x='category', y='销售总额', kind='bar', figsize=(10, 5), title='各课程分类销售额') plt.show()

这里有个必踩的坑:matplotlib默认字体不支持中文,所以需要指定SimHei字体。如果不设这两行,图里所有中文都会显示成方块。这可以说是每个Python新手都会遇到的经典问题之一。

再看最近三个月的销售趋势。先保证order_date能按正确顺序排序,最好统一转成日期类型:

df['order_date'] = pd.to_datetime(df['order_date']) df['月份'] = df['order_date'].dt.to_period('M').astype(str) monthly_sales = df.groupby('月份')['price'].sum().sort_index() monthly_sales.plot(kind='line', marker='o', figsize=(10, 5), title='月度销售总额趋势') plt.ylabel('销售额') plt.show()

pd.to_datetime把日期列转为时间类型,然后dt.to_period('M')提取出“年月”。之后按月份分组求和,就得到每月的销售额序列。sort_index()保证图上的时间从左到右是从早到晚,否则出现倒序的折线会很尴尬。

到这一步,你已经独立跑完了一个微型的完整分析流程。这个能力放在实际工作中,可以迁移到电商、教育、运营、金融等多个行业,因为底层的模型是一样的,都走“读取-清洗-聚合-可视化”这条路径。

5. 常见问题与排查技巧实录

5.1 高频报错速查表

我在带学员的过程中收集了一批高频问题,这里整理成一张速查表,每个问题都附上排查思路:

报错或现象核心原因解决思路
FileNotFoundError文件路径不对或文件名拼错确认文件是否在Notebook同目录,打印os.getcwd()查看当前目录
UnicodeDecodeError文件编码与默认编码不一致尝试在read_csv中加encoding='gbk'或encoding='utf-8'
图表中文显示为方块matplotlib默认字体不支持中文设置mpl.rcParams['font.sans-serif'] = ['SimHei']
KeyError: 'xxx'列名拼错或不存在用df.columns查看全部列名,注意大小写和空格
计算出的金额与预期不符重复值或缺失值没处理干净回到清洗步骤,打印df.info()和df.duplicated().sum()
NameError: name 'pd' is not defined单元格中没导入pandas回到顶部执行import pandas as pd

这里面最容易被忽略的是最后一种情况。在Jupyter里,它跟写完整脚本不一样,每个单元格独立执行,如果某一轮的import代码没被运行过,后面的所有单元格都会报NameError。这种问题很常见,重启内核全跑一遍往往就解决了。

5.2 那些不会写进文档的细节

很多经验只有在真实项目中踩过坑才会懂。这里挑几个我认为最有价值的心得分享。

第一个心得:永远不要用“肉眼去数”来验证代码结果。我见过学员做完去重后,凭感觉认为还有重复,结果又去手动跑了一遍drop_duplicates。正确做法是先在重复数据上留下可复现的“数字痕迹”,比如打印去重前后行数对比,这样逻辑才严密,别人看你的脚本也知道你做了什么处理。

第二个心得:操作之前先复制一份原始数据。数据清洗是破坏性操作,一不小心就把源头数据改坏了。我自己的习惯是:

df_raw = pd.read_csv('course_sales.csv') df = df_raw.copy()

后续所有清洗操作都在df上做,万一洗脏了,随时从df_raw重新来。这个习惯成本几乎为零,但救过我很多次,强烈建议每个新手都养成。

第三个心得:把分析脚本拆成有意义的函数。哪怕你只是个零基础初学者,一旦脚本超过几十行,结构就很重要了。最简单的拆法是按“清洗”“统计”“画图”三块分开写,中间留空行并使用注释。这样做的好处是bug容易定位,逻辑也更清楚。等以后做更大项目,这套习惯会成为你最大的底牌。

第四个心得:时刻关注数据的“业务意义”。数字跑出来了,不代表结论正确。比如某个月销售额突然暴增,要先想想是不是因为重复记录没清理干净,而不是急着欢呼。数据分析到最后,真正区分水平高低的是对业务的理解和数据敏感度,这是Python语法给不了你的东西,只能靠一次次实操慢慢养出来。

5.3 怎么让它变成自己的工作能力

学完这个流程后,很多人会面临“好像懂了,但换一份数据又不会了”的尴尬。我的建议是:不要满足于跟着教程跑通一遍,试着做三次“迁移练习”。

第一次迁移:换一份CSV数据,重复跑同样的清洗和统计流程,哪怕数据字段名换了也没关系,逼自己靠理解修改代码。第二次迁移:新增一个聚合维度,比如同时按分类和月份统计,体会groupby多列分组的写法。第三次迁移:把画图部分改成柱状图和箱线图以外的其他图表类型,比如散点图或饼图,加深对kind参数的理解。

只需这样练三次,你的数据分析能力就有了质的提升。因为这三次练的不是代码,而是“识别需求-拆解步骤-组织代码”的思路,这才是真正能在工作中迁移的核心能力。我曾经用这种方法带过不少零基础学员,最快的一个在两周内就能独立完成常规报表,靠的就是这种反复迁移练习,而不是一遍遍刷语法题。

回到开头说的那句话:数据分析不是数学,而是做饭。跟着炒熟一道菜后,换食材、换调料都不该难倒你。现在你手头已经有了完整的锅和铲,剩下的就是开火,多做几道菜。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/10 4:34:13

Spring Boot 4.0 GA深度解析:新特性盘点与3.x迁移实操指南

Spring Boot 4.0.0正式GA了,就在2025年11月。如果你还在用3.2或者3.3维护老项目,这次升级可能会让你有些头疼——因为它不只是换版本号,而是底层技术栈的一次大换血。Spring Boot 4基于是Spring Framework 7构建的,Java 17成了最底…

作者头像 李华
网站建设 2026/10/10 4:33:43

KonopkaControls 8.0 在 RAD Studio 12.3 中的源码编译安装全攻略

简介:KonopkaControls-290-8.0-For12.3-01 是一套面向 Delphi 12.3 开发环境的完整控件源码包,源自 Raize Components 并延续了其组件界面增强能力,适合需要构建复杂窗口与对话框、提升交互体验的中高级 Delphi 开发者;源码级交付…

作者头像 李华
网站建设 2026/10/10 4:33:11

微动开关频繁烧毁?从电流选型到整改方案全解析

1. 先说结论:烧微动开关,九成是选型的时候太抠了干设备维修这些年,最怕听到的一句话就是“又烧了”。尤其是微动开关这种小东西,坏了换一个成本不高,但架不住三天两头烧。你换一次五分钟,产线停机一小时&am…

作者头像 李华
网站建设 2026/10/10 4:33:06

显卡坞+量化+分层卸载:16G显存跑70B大模型实战指南

先抛结论别急着划走:16G 显存当然装不下 40GB 模型,显卡坞也不会把显存变大,但通过“量化 分层卸载”这套组合拳,把 70B 级别的大模型在本地跑起来是真实可行的。我自己按这个思路搭了一套:RTX 4060 Ti 16G 接显卡坞&…

作者头像 李华
网站建设 2026/10/10 4:31:54

边缘计算测试实战:环境搭建、用例设计与故障排查指南

边缘计算测试这几年算是彻底火起来了,但真正上手做过的人都知道,它和传统云计算测试完全是两码事。我们原来那套在云上跑得顺顺当当的测试体系,一搬到边缘节点上就各种失灵。这篇文章不打算写什么高深理论,就把我在实际测试工作中…

作者头像 李华
网站建设 2026/10/10 4:30:38

ima+workbuddy:轻量可审计的双模态知识库实践

1. 项目概述:从“临时查文档”到“知识长在脑子里”的真实转变我用ima workbuddy 知识库这套组合,已经整整半年了。不是试用,不是摆设,是每天打开电脑第一件事——不是点微信、不是开邮箱,而是点开 workbuddy 工作台&…

作者头像 李华