尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python数据分析入门:NumPy+Pandas+Matplotlib实战教程

Python数据分析入门:NumPy+Pandas+Matplotlib实战教程 大家好我是老猫。很多零基础读者在后台问我想学数据分析但不知道怎么装环境不知道 NumPy 和 Pandas 有什么区别更不知道 Matplotlib 怎么画图网上东拼西凑的资料又常常卡在环境安装上。这篇文章就是为了解决这些问题。我会从 Python 数据分析最核心的三大库开始一步一步带你把环境搭好、把代码跑起来、把图画出来。文章属于新手友好型你不需要有编程基础只要会打开电脑、能跟着命令操作就能完成整套 Python 数据分析入门流程。1. 背景与核心概念三个库分别解决什么问题1.1 Python 数据分析的“三驾马车”大多数数据分析场景都跑不掉这三个库NumPy、Pandas、Matplotlib。它们分工明确又相互配合。简单来说NumPy 管数值运算Pandas 管表格处理Matplotlib 管数据可视化。理解这三者的关系你的数据学习路线会很清晰。打个比方你要分析一批商品销售记录。Pandas 负责把 Excel 或 CSV 里的数据读成表格像在 Excel 里一样筛选、排序、求平均值NumPy 在幕后提供高效的数值数组和数学函数Pandas 很多高性能计算都建立在 NumPy 之上Matplotlib 则把处理好的数据画成折线图、柱状图或饼图让你一眼看见趋势和异常。很多新手容易陷入一个误区觉得这三个库是三个独立的学科要分开学很久。实际上在实际项目中它们是混着用的。比如你用 Pandas 读取数据、清洗数据然后调用 NumPy 函数做数值计算最后把统计结果传给 Matplotlib 绘图。今天这篇文章会把这条链路完整串起来。1.2 NumPy高性能多维数组运算NumPyNumerical Python是 Python 科学计算的基础库。它的核心是ndarrayN 维数组对象。为什么 Python 本身已经有列表list还要用 NumPy 数组因为列表在存储和运算时存在大量类型判断和装箱开销而 NumPy 数组在内存中是连续存储、类型统一的数据块所以计算速度远快于原生 Python 循环。举个例子对一万个数字求平方使用 Python 列表推导可能需要几毫秒而使用 NumPy 数组可能只需要不到一毫秒而且代码更简洁import numpy as np data list(range(10000)) result_python [x ** 2 for x in data] arr np.array(data) result_numpy arr ** 2这还只是简单例子。在实际数据分析中你要处理几百万条记录性能差异会被放大到非常明显的程度。1.3 Pandas表格数据的瑞士军刀PandasPanel Data 的简称虽然现在这个词已经不那么精确是 Python 数据分析最常用的表格处理库。它提供了两个核心数据结构Series一维带标签数组和DataFrame二维表格。如果说 NumPy 能帮你把一堆数字快速算好那么 Pandas 能帮你像操作 Excel 表格一样去操作数据。你可以按列名筛选数据、按条件过滤、合并多张表、对缺失值进行处理、分组统计、数据透视等。对于从 Excel 转过来的人Pandas 的学习曲线并不陡峭因为很多操作和 Excel 的筛选、透视表、VLOOKUP 是类似的思路。1.4 Matplotlib把数据变成图表Matplotlib 是 Python 最经典的数据可视化库。它的设计思路很像 MATLAB通过一层层的绘图接口控制坐标轴、线条样式、图例和标题。虽然现在市面上有很多比 Matplotlib 更“漂亮”的可视化库比如 Seaborn、Plotly但 Matplotlib 依然是所有可视化方案的地基后续学其他库往往也基于它的语法。对新手来说刚开始只需要掌握几个核心绘图函数plt.plot()画折线图、plt.bar()画柱状图、plt.scatter()画散点图、plt.hist()画直方图然后学会设置标题、轴标签、图例就足够完成大多数入门项目了。2. 环境准备与版本说明2.1 Python 版本选择开始安装库之前我们需要先确定 Python 基础环境。截至 2026 年Python 官方主推的稳定版本已经迭代到 3.12 及以上版本建议你直接前往 Python 官网下载最新的稳定版解释器。如果你使用的项目是老项目也可以根据需要选择 3.9 到 3.11 之间的版本但新项目不建议再使用 3.8 以下的老版本因为部分新版本数据分析库已经开始放弃对旧版本 Python 的支持。本文示例以常见环境为例重点演示配置思路。无论你最终安装的是哪个 Python 小版本只要保证是 Python 3.9 以上下面讲解的代码都能正常运行。2.2 使用 Anaconda 还是纯 Python对零基础入门数据分析的人我通常建议直接安装 Anaconda。Anaconda 是一个集成的 Python 发行版里面已经预装了 NumPy、Pandas、Matplotlib、Jupyter Notebook 等大多数数据分析工具省去很多手动安装配置的麻烦。它的缺点是安装包比较大但对新手来说稳定性更重要。如果你不想安装庞大的 Anaconda也可以选择纯 Python pip 方式。两种方式的对比对比项Anaconda纯 Python pip安装包大小较大几百 MB 到 1 GB很小几十 MB预装数据分析库已预装多数常用库需要手动安装适合人群零基础、本地学习为主有一定基础或项目环境受限环境管理Conda 环境管理较方便venv pip 更轻量如果你选择纯 Python 方式安装完 Python 后在命令行执行以下命令即可安装三个核心库pip install numpy pandas matplotlib如果遇到网络慢的问题可以临时切换为国内镜像源例如清华镜像pip install numpy pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple2.3 验证环境是否安装成功安装完成后在 Python 交互式环境或命令行中执行以下代码查看版本号确认安装成功import numpy import pandas import matplotlib print(NumPy 版本:, numpy.__version__) print(Pandas 版本:, pandas.__version__) print(Matplotlib 版本:, matplotlib.__version__)如果能正常输出三个版本号说明环境已经准备完毕。我在文末还会给出常见安装问题和排查思路。3. 核心语法拆解NumPy 数值运算3.1 创建数组的基本方式NumPy 最常用的对象是ndarray。创建数组的方式有很多这里从最基础的np.array()开始import numpy as np # 从列表创建一维数组 arr1 np.array([1, 2, 3, 4, 5]) print(arr1, arr1.shape) # 从嵌套列表创建二维数组 arr2 np.array([[1, 2, 3], [4, 5, 6]]) print(arr2) print(形状:, arr2.shape) # (2, 3)shape属性表示数组的形状维度非常重要。一维数组(5,)表示有 5 个元素二维数组(2, 3)表示 2 行 3 列。理解 shape 对后面广播运算、矩阵操作有直接影响。除了从列表创建NumPy 还提供了几个快捷生成函数# 生成全 0 数组 zeros np.zeros((2, 3)) print(zeros) # 生成全 1 数组 ones np.ones((3, 2)) print(ones) # 生成范围数组类似 range arr np.arange(0, 10, 2) # 从0到10步长为2 print(arr) # [0 2 4 6 8] # 生成等间隔数组 lin np.linspace(0, 1, 5) # 0到1之间等分成5个数 print(lin) # [0. 0.25 0.5 0.75 1. ]np.arange()与 Python 内置的range()类似但支持浮点数步长np.linspace()用于生成等间隔的点在画图时经常用来构造 x 轴坐标。3.2 数组索引与切片NumPy 数组的索引和 Python 列表类似但多维数组需要用逗号分隔各个维度的下标arr2 np.array([[1, 2, 3], [4, 5, 6]]) # 取第 0 行第 1 列的元素 print(arr2[0, 1]) # 2 # 取第 1 行 print(arr2[1]) # [4 5 6] # 取第 1 列 print(arr2[:, 1]) # [2 5] # 取前两行、第一列到第二列 print(arr2[:2, :2])切片的语法是起始:结束:步长注意左闭右开。这里有一个非常容易踩的坑NumPy 的切片是视图view而不是复制copy。也就是说如果你修改切片结果原数组也会跟着变。如果希望得到独立的副本必须显式调用.copy()a np.array([1, 2, 3, 4]) b a[:2] b[0] 100 print(a) # [100 2 3 4] 注意原数组也变了 c a[:2].copy() c[0] -1 print(a) # [100 2 3 4] 原数组不受影响这是很多新手很容易被坑的地方一定要记住。3.3 向量化运算与广播机制NumPy 最核心的优势是向量化运算不需要写循环直接对整个数组做数学运算。arr np.array([1, 2, 3, 4]) print(arr 10) # [11 12 13 14] print(arr * 2) # [ 2 4 6 8] print(arr ** 2) # [ 1 4 9 16] print(np.sqrt(arr)) # 开平方 print(np.sum(arr)) # 求和 print(np.mean(arr)) # 求平均广播Broadcasting机制则允许不同形状的数组进行运算。比如一个二维数组和一行做加法时NumPy 会自动把这一行“复制”到每一行上matrix np.array([[1, 2, 3], [4, 5, 6]]) row np.array([10, 10, 10]) result matrix row print(result) # [[11 12 13] # [14 15 16]]虽然这里说“复制”是为了方便理解实际内存中并不会真正复制数据。广播机制非常强大但也容易让人困惑早期只要记住形状不一致时可以按规则自动扩展如果完全无法兼容就会报 ValueError。3.4 矩阵运算与聚合函数数据分析中经常需要做矩阵乘法或聚合统计。NumPy 使用np.dot()或运算符进行矩阵乘法使用sum、mean、max、min、std等聚合函数进行统计。聚合函数通过axis参数控制计算方向这是很容易混淆的地方。data np.array([[1, 2, 3], [4, 5, 6]]) print(整体求和:, data.sum()) # 21 print(按行求和:, data.sum(axis1)) # [6 15] print(按列求和:, data.sum(axis0)) # [5 7 9]在 NumPy 多维数组中axis0代表沿行的方向跨行也就是按列操作axis1代表沿列的方向跨列也就是按行操作。很多参考资料在这点上表述不一致我建议你在实际代码里多打印几遍确认。4. 核心语法拆解Pandas 表格处理4.1 认识 DataFramePandas 的DataFrame相当于一张内存中的二维表格有行索引index和列名columns。你可以基于字典创建import pandas as pd data { 姓名: [张三, 李四, 王五], 年龄: [25, 30, 28], 城市: [北京, 上海, 广州] } df pd.DataFrame(data) print(df)输出如下姓名 年龄 城市 0 张三 25 北京 1 李四 30 上海 2 王五 28 广州可以看到行索引默认从 0 开始。DataFrame 的每个列都是一个Series。Series可以理解为带索引的一维数组。4.2 数据读取与查看Pandas 最常用的数据读取方式是从 CSV 文件读取df pd.read_csv(sales_data.csv)如果是 Excel 文件需要确保安装了openpyxl或xlrd依赖库pip install openpyxldf pd.read_excel(sales_data.xlsx, sheet_nameSheet1)读取数据后先用几个基础方法快速了解数据概况# 查看前5行 print(df.head()) # 查看后5行 print(df.tail()) # 查看数据形状 print(df.shape) # 查看列名 print(df.columns) # 查看缺失值情况 print(df.isnull().sum()) # 查看每列数据类型 print(df.dtypes) # 描述性统计 print(df.describe())df.describe()会对数值列自动统计数量、均值、标准差、最小值、四分位数和最大值是快速了解数据分布的第一利器。4.3 数据筛选与条件过滤Pandas 筛选数据的语法非常接近自然语言。先看按列名选择# 选择单列 df[年龄] # 选择多列 df[[姓名, 城市]] # 按行索引切片 df[1:3]再看条件过滤。这是数据分析中最常用的操作之一# 筛选年龄大于 26 的数据 filtered df[df[年龄] 26] print(filtered) # 多条件年龄大于 26 且城市为上海 filtered df[(df[年龄] 26) (df[城市] 上海)] print(filtered) # 多条件城市为北京或广州 filtered df[(df[城市] 北京) | (df[城市] 广州)] print(filtered)这里必须强调Pandas 中的条件筛选使用且和|或而不是 Python 的and和or。因为df[年龄] 26返回的是一个布尔 Series而and不能用于 Series 的逐元素逻辑运算会直接报ValueError: The truth value of a Series is ambiguous。这是初学者最常遇到的报错之一。4.4 数据清洗处理缺失值与重复值真实数据分析中原始数据几乎不可能整整齐齐。Pandas 提供了完整的数据清洗方案。处理缺失值import numpy as np import pandas as pd df pd.DataFrame({ A: [1, 2, np.nan, 4], B: [5, np.nan, 7, 8] }) # 删除含缺失值的行 df_clean df.dropna() # 用 0 填充缺失值 df_filled df.fillna(0) # 用每列均值填充缺失值 df_filled_mean df.fillna(df.mean()) print(df_filled_mean)处理重复值df pd.DataFrame({ 姓名: [张三, 李四, 张三, 王五], 年龄: [25, 30, 25, 28] }) # 删除完全重复的行 df_dedup df.drop_duplicates() # 按指定列判断重复 df_dedup_by_name df.drop_duplicates(subset[姓名])drop_duplicates()默认保留第一条重复数据。如果希望保留最后一条可以传入参数keeplast。这在处理日志表、订单表时非常实用比如同一个用户有多条操作记录你想只保留每个用户最近一条。4.5 分组聚合与排序分组聚合是数据分析的高频操作等价于 Excel 中的透视表。groupby()是 Pandas 提供的最核心的分组方法。假设我们有一份订单数据df pd.DataFrame({ 商品: [苹果, 香蕉, 苹果, 苹果, 香蕉], 销量: [10, 5, 8, 12, 7], 金额: [30, 10, 24, 36, 14] })按商品分组求销量和金额的总和result df.groupby(商品)[[销量, 金额]].sum() print(result)输出销量 金额 商品 苹果 30 90 香蕉 12 24如果希望分组后同时计算多个统计量可以使用agg()result df.groupby(商品)[金额].agg([sum, mean, count]) print(result)排序也是常见的操作df_sorted df.sort_values(金额, ascendingFalse) print(df_sorted)ascendingFalse表示降序排列。对于文本列可以直接排序对于数值列注意sort_values的默认行为是升序。4.6 数据集合并多表合并是数据清洗和特征构建中非常常见的步骤。Pandas 提供了merge()和concat()两个核心函数。merge()类似 SQL 中的 JOIN根据共同列将两个 DataFrame 连接到一起df1 pd.DataFrame({ 姓名: [张三, 李四], 部门: [技术部, 市场部] }) df2 pd.DataFrame({ 姓名: [张三, 李四], 薪资: [15000, 12000] }) merged pd.merge(df1, df2, on姓名) print(merged)concat()则是简单的拼接按行拼接时使用axis0按列拼接时使用axis1df_a pd.DataFrame({A: [1, 2]}) df_b pd.DataFrame({B: [3, 4]}) df_concat_row pd.concat([df_a, df_b], axis0) # 行拼接 df_concat_col pd.concat([df_a, df_b], axis1) # 列拼接5. 核心语法拆解Matplotlib 数据绘图5.1 基本绘图流程Matplotlib 的使用思路很直白创建画布、绘制图形、设置标签、显示或保存。看一个最简单的例子import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y [2, 4, 1, 5, 3] plt.plot(x, y) plt.title(最简单的折线图) plt.xlabel(X 轴) plt.ylabel(Y 轴) plt.show()如果希望在 Jupyter Notebook 中直接显示图形不需要调用plt.show()但需要加上一行魔法命令%matplotlib inline如果是在 PyCharm 或 VS Code 中运行普通.py文件plt.show()会弹出一个窗口显示图形。5.2 常用图形折线图、柱状图、散点图、直方图折线图适合展示随时间变化的趋势import matplotlib.pyplot as plt months [1月, 2月, 3月, 4月, 5月, 6月] sales [120, 135, 118, 160, 175, 190] plt.plot(months, sales, markero, linestyle-, colorblue, label2026年销量) plt.title(月度销量趋势) plt.xlabel(月份) plt.ylabel(销量) plt.legend() plt.grid(True, linestyle--, alpha0.6) plt.show()这里markero在数据点上画小圆点linestyle-表示实线color设置颜色label设置图例名称grid()添加网格线。柱状图适合对比不同类别的数据categories [苹果, 香蕉, 橙子, 葡萄] counts [30, 18, 25, 22] plt.bar(categories, counts, color[red, yellow, orange, purple]) plt.title(各类水果销量对比) plt.xlabel(水果种类) plt.ylabel(销量) plt.show()散点图适合观察两个数值变量之间的关系import numpy as np # 生成随机数据 np.random.seed(42) x np.random.rand(50) * 100 y x * 2 np.random.randn(50) * 10 plt.scatter(x, y, alpha0.7, cgreen) plt.title(散点图X 与 Y 的关系) plt.xlabel(X) plt.ylabel(Y) plt.show()alpha参数控制透明度当点很多发生重叠时降低透明度能更清楚地看到密度分布。直方图适合查看单个变量的分布情况data np.random.randn(1000) plt.hist(data, bins30, edgecolorblack, alpha0.7) plt.title(数据分布直方图) plt.xlabel(数值) plt.ylabel(频数) plt.show()bins参数控制分箱数量简单理解就是直方图的柱子数量。默认bins10你可以根据数据量调整。5.3 一张图中绘制多条曲线在数据分析报告中经常需要在一张图中对比多个维度的变化趋势。Matplotlib 可以多次调用plot()方法import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y1 [2, 3, 5, 7, 11] y2 [1, 2, 4, 8, 16] plt.plot(x, y1, markero, labelA 产品) plt.plot(x, y2, markers, labelB 产品) plt.title(产品对比趋势) plt.xlabel(月份) plt.ylabel(销售额) plt.legend() plt.show()markers表示方块形标记。通过label和legend()配合可以自动生成图例。5.4 子图与画布大小控制如果希望在一张图中显示多个子图可以使用plt.subplots()。这个函数返回画布对象和子图坐标轴对象import matplotlib.pyplot as plt fig, axes plt.subplots(2, 2, figsize(10, 6)) # fig 是整个画布axes 是包含所有子图的数组 # 第一个子图折线图 axes[0, 0].plot([1, 2, 3], [1, 4, 9]) axes[0, 0].set_title(折线图) # 第二个子图柱状图 axes[0, 1].bar([A, B, C], [3, 5, 2]) axes[0, 1].set_title(柱状图) # 第三个子图散点图 axes[1, 0].scatter([1, 2, 3], [2, 4, 6]) axes[1, 0].set_title(散点图) # 第四个子图直方图 import numpy as np axes[1, 1].hist(np.random.randn(100), bins20) axes[1, 1].set_title(直方图) plt.tight_layout() plt.show()figsize控制画布大小单位是英寸。很多博客中问“matplotlib 画布大小怎么设置”就是通过figsize(宽, 高)调整。tight_layout()可以自动调整子图间距避免标题和标签重叠。另一个与画布大小相关的高频问题是设置 x 轴和 y 轴比例统一。如果要让散点图中横纵轴的单位刻度在屏幕上看起来比例一致可以使用set_aspect(equal)fig, ax plt.subplots() ax.scatter([1, 2, 3], [1, 4, 9]) ax.set_aspect(equal) plt.show()5.5 保存图片绘制完成后的图形可以保存为图片文件而不是每次手动截图。在调用plt.show()之前或之后调用plt.savefig()注意需要保证图形存在plt.plot([1, 2, 3], [4, 5, 6]) plt.savefig(plot_output.png, dpi150, bbox_inchestight)dpi150提高图片分辨率bbox_inchestight会裁剪掉多余的空白区域。在企业报告或论文插图中png 和 pdf 是最常见的输出格式。6. 完整实战案例电商销售数据分析前面的内容拆开了每个库的语法这里我们来一个完整的分析案例把 NumPy、Pandas、Matplotlib 串起来。案例背景你拿到一份某电商平台 2026 年第一季度的订单数据字段包括订单日期、商品类别、销售额、地区。最终目标是分析各商品类别的销售额占比和月度销售趋势并生成可视化图表。6.1 创建示例数据为了便于演示这里直接使用代码生成一份模拟数据保存为 CSV 文件。你可以把这一步理解为模拟从业务系统导出的原始数据import pandas as pd import numpy as np np.random.seed(2026) dates pd.date_range(start2026-01-01, end2026-03-31, freqD) categories [手机, 电脑, 家电, 服饰] regions [华北, 华东, 华南, 西部] rows [] for date in dates: for _ in range(20): rows.append({ 订单日期: date, 商品类别: np.random.choice(categories), 销售额: round(np.random.uniform(100, 5000), 2), 地区: np.random.choice(regions) }) df pd.DataFrame(rows) df.to_csv(sales_data.csv, indexFalse, encodingutf-8-sig) print(df.head())这里使用pd.date_range生成从 2026 年 1 月 1 日到 3 月 31 日的日期序列。np.random.choice以均匀概率随机选中商品类别和地区。indexFalse表示不保存行索引encodingutf-8-sig是为了让 Excel 打开 CSV 时正确显示中文。6.2 读取数据并进行清洗读取数据后先做基础检查df pd.read_csv(sales_data.csv, parse_dates[订单日期]) # 查看数据形状 print(数据量:, df.shape) # 检查缺失值 print(缺失值数量:) print(df.isnull().sum()) # 检查重复项 print(重复行数量:, df.duplicated().sum()) df df.drop_duplicates() # 查看数据类型 print(df.dtypes)parse_dates参数可以让 Pandas 在读取时自动将“订单日期”解析为 datetime 类型。这一步非常有用后面按月份聚合统计时就需要正确的日期时间类型。对于销售额列如果存在异常负数或 0通常需要结合业务判断是否过滤。这里为了演示我们只过滤销售额小于等于 0 的数据df df[df[销售额] 0]6.3 按商品类别进行聚合统计我们想看看第一季度各类商品的销售额分布用groupby聚合category_stats df.groupby(商品类别)[销售额].agg([sum, mean, count]) category_stats category_stats.sort_values(sum, ascendingFalse) print(category_stats)输出大致如下sum mean count 商品类别 手机 1123456.23 2536.15 443 电脑 987654.32 2450.31 403 家电 876543.21 2126.33 412 服饰 654321.09 1789.34 365sum是总销售额mean是单笔均价count是订单数量。6.4 按月统计销售趋势要按月份统计趋势首先从日期列中提取月份信息再分组求和df[月份] df[订单日期].dt.to_period(M) monthly_sales df.groupby(月份)[销售额].sum().reset_index() print(monthly_sales).dt.to_period(M)会把日期转换为月份周期比如 2026-01从而实现对月份级别的分组聚合。reset_index()将分组后的索引转回普通列方便后续作图。6.5 使用 Matplotlib 绘制分析结果绘制两个核心图表各类别销售额柱状图和月度趋势折线图。第一个图商品类别销售额柱状图import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 解决中文乱码问题 plt.figure(figsize(8, 5)) plt.bar(category_stats.index, category_stats[sum], color[#4C72B0, #DD8452, #55A868, #C44E52]) plt.title(2026 年第一季度各类商品销售额对比) plt.xlabel(商品类别) plt.ylabel(销售额元) # 在每个柱状图上方显示数字 for i, v in enumerate(category_stats[sum]): plt.text(i, v * 0.98, f{v/10000:.1f}万, hacenter, vatop, fontsize10) plt.tight_layout() plt.savefig(category_sales.png, dpi150) plt.show()这里两行plt.rcParams非常关键。默认 Matplotlib 不识别中文字体如果不配置中文字体图表中的“手机”“电脑”等文字会全部变成方块。具体字体名需要根据系统选择Windows 下常用SimHei或Microsoft YaHeimacOS 下常用Arial Unicode MS。axes.unicode_minusFalse用于解决负号显示为方块的问题。第二个图月度销售趋势折线图fig, ax plt.subplots(figsize(9, 5)) # 将 Period 转为字符串避免显示问题 months monthly_sales[月份].astype(str) sales monthly_sales[销售额] ax.plot(months, sales, markero, linestyle-, linewidth2, color#4C72B0) ax.set_title(2026 年第一季度月度销售额趋势) ax.set_xlabel(月份) ax.set_ylabel(销售额元) ax.grid(True, linestyle--, alpha0.5) # 在数据点上标注具体数值 for i, v in enumerate(sales): ax.text(i, v * 1.02, f{v/10000:.1f}万, hacenter, fontsize10) plt.tight_layout() plt.savefig(monthly_sales_trend.png, dpi150) plt.show()6.6 运行与验证将上述代码按顺序保存为一个.py文件例如sales_analysis.py在命令行执行python sales_analysis.py如果代码正常执行项目目录下会生成sales_data.csv、category_sales.png、monthly_sales_trend.png三个文件。控制台输出数据量: (2400, 4)和每月销售额汇总。这段完整案例覆盖了数据分析最常见的流程数据模拟或读取、数据清洗、分组聚合、时间序列处理、可视化展示。实际项目中你只需要把pd.read_csv换成真实的业务数据源然后根据业务需求调整筛选和聚合条件即可。7. 常见问题与排查思路7.1 安装库时报错或安装失败问题现象常见原因解决思路pip 不是内部或外部命令Python 未安装或未加入 PATH重新安装 Python安装时勾选 Add Python to PATHCould not find a version that satisfies the requirement numpyPython 版本过低或 pip 版本过旧升级 Python 到 3.9执行python -m pip install --upgrade pipERROR: Could not install packages due to an EnvironmentError文件权限不足使用pip install --user或在管理员命令行中安装下载速度极慢网络原因使用国内镜像源例如清华或阿里云ImportError: numpy.core.multiarray failed to import库版本冲突在虚拟环境中统一重装 numpy 和 pandas7.2 代码运行时报错问题现象常见原因解决思路ModuleNotFoundError: No module named pandas库未安装或安装了多个 Python 环境检查当前解释器路径安装到正确环境ValueError: The truth value of a Series is ambiguous条件筛选中使用了and或or改为和|并使用括号括起每个条件KeyError: 列名列名不存在可能包含空格或大小写不匹配先打印df.columns确认列名TypeError: unsupported operand type(s)DataFrame 与错误类型运算检查数据类型使用pd.to_numeric()转换Matplotlib 图表中文显示为方块缺少中文字体配置设置plt.rcParams[font.sans-serif]注意字体名称与系统匹配ValueError: x and y must have same first dimension折线图输入 x 和 y 长度不一致检查两个数组的长度是否相同7.3 三个容易忽视的坑第一编码问题。读取 CSV 文件时如果文件是 Excel 保存的默认编码可能是gbk或gb2312此时pd.read_csv()报UnicodeDecodeError。解决方法是指定编码pd.read_csv(file.csv, encodinggbk)如果还不行换encodingutf-8或encodinglatin1。第二副本与视图问题。前面提到 NumPy 切片是视图Pandas 也存在类似问题。在 Pandas 中对 DataFrame 切片后做赋值操作时经常会出现SettingWithCopyWarning警告。这个警告的意思是你修改的可能是一个临时副本不一定会写回原 DataFrame。写代码时宁可多调用一次.copy()也不要依赖隐式行为。第三不同库的导入方式容易混淆。NumPy 的惯例是import numpy as npPandas 是import pandas as pdMatplotlib 的 pyplot 部分是import matplotlib.pyplot as plt。这三个别名是社区约定俗成的写法几乎不会有人用全名建议你直接记住。8. 最佳实践与工程建议8.1 用虚拟环境隔离项目依赖数据分析项目往往涉及多个第三方库不同项目对库版本要求可能不同。比如一个项目用 pandas 1.5另一个项目可能已经在用 pandas 2.2。为了避免互相干扰建议每个项目使用独立的虚拟环境。如果你使用 Anaconda可以用 conda 创建conda create -n data_analysis python3.11 conda activate data_analysis如果你使用原生 Python可以用 venvpython -m venv venv # Windows venv\Scripts\activate # macOS / Linux source venv/bin/activate激活虚拟环境后再执行pip install numpy pandas matplotlib。项目结束后导出依赖清单方便复现pip freeze requirements.txt这里额外提醒一个隐藏问题很多人在本机安装了多个 Python 版本导致pip install装到了另一个 Python 环境中然后在 IDE 中运行时却找不到包。遇到这种场景需要在 IDE 中检查项目解释器路径确认指向的是当前虚拟环境。8.2 数据处理时注意边界条件数据分析的第一步不是写模型而是了解数据。建议每次拿到数据都先做四件事df.head()和df.tail()查看首尾数据了解字段含义。df.info()查看列类型和非空值数量。df.isnull().sum()统计缺失值。df.describe()查看数值列的统计量。另外在筛选和清洗时要特别注意边界条件。例如判断销售额等于 0 的记录是否应该保留缺失值到底是删除还是填充删除重复行时以哪些列作为唯一标识。这些问题没有标准答案必须结合业务背景来判断。8.3 代码可读性与命名规范数据分析代码经常是一次性脚本但这不代表可以随意命名。变量名要能表达含义比如用category_sales而不是cs用raw_df表示原始数据、clean_df表示清洗后的数据。写注释时说明“为什么这么做”而不是单纯重复代码。推荐将分析步骤拆分成函数或脚本片段。一个完整的数据分析项目至少包含数据读取、数据清洗、特征处理、结果分析、可视化输出这几个模块。即使不做成大型工程用# 01 读取数据、# 02 数据清洗这样的注释分隔段落也能极大提升调试效率。8.4 性能优化意识要提前建立虽然新手阶段不要求优化到极致但有一些好习惯可以提前养成不要用 Python 循环处理 DataFrame 行数据尽量使用 Pandas 的向量化操作。需要迭代 DataFrame 时优先考虑df.itertuples()它的速度远快于df.iterrows()。只要涉及多个数值运算先转成 NumPy 数组再计算。处理超大 CSV 文件时可以传入dtype参数指定列类型、usecols参数只读取需要的列减少内存占用。另外read_csv有一个很实用的参数nrows可以只读入前 N 行。当你面对的是几 GB 的大文件时先用nrows10000快速看结构再决定后续处理方案能节省大量时间。8.5 图表输出与报告规范在生成图表时第一原则是“一张图只讲一件事”。图表的标题、轴标签、图例要完整别人拿到这张图不做过多解释就能看懂。配色不要过于花哨默认配色通常已经足够好。如果是给报告使用建议统一图片分辨率和风格例如统一使用dpi150图片宽度保持一致。对于中文报告字体配置是一个常见问题。更稳妥的做法是在代码开头统一设置import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Microsoft YaHei, SimHei, Arial Unicode MS, PingFang SC] plt.rcParams[axes.unicode_minus] False这样在不同系统之间切换时Matplotlib 会自动选择第一个可用的中文字体。8.6 安全与数据隐私意识在练习和工作中如果使用的是真实业务数据一定要遵守数据安全规范。不要在生产环境数据库直接执行批量更新或删除操作不要将包含个人敏感信息的 CSV 文件随便提交到公开代码仓库。在学习阶段建议优先使用公开数据集或自己构造的模拟数据。这篇文章中的实战案例采用的就是完全随机生成的模拟数据可以直接复用。9. 下一步学习路线到这里你已经完成了一条完整的 Python 数据分析入门链路从环境搭建到 NumPy 数值运算从 Pandas 表格处理到 Matplotlib 数据绘图最后通过一个电商销售分析案例把所有内容串起来。你现在可以做到读取一份 CSV 数据、清洗缺失值、按条件筛选、分组聚合、绘制柱状图和折线图。这对于零基础入门来说已经是非常扎实的起点。接下来可以往这几个方向扩展深入学习 Pandas 的时间序列处理比如重采样resample、移动窗口计算这对金融和销售数据分析非常有用。学习 Seaborn 库它是基于 Matplotlib 的高级可视化封装画出的统计图表更好看而且代码更短。学习数据清洗相关的进阶技巧比如 apply 自定义函数、map 映射、astype 类型转换。如果想做更复杂的分析可以学习 SQL因为很多企业的数据存在数据库中先要用 SQL 取数再用 Python 分析。如果对机器学习感兴趣下一步可以了解 scikit-learn 的入门内容它的接口和 Pandas、NumPy 配合得非常好。如果在安装环境或运行代码时遇到报错可以先对照本文的“常见问题与排查思路”部分。如果仍然无法解决建议查看完整报错信息中的文件名和行号将报错信息复制到搜索引擎中搜索大部分问题都能找到解决方案。数据分析是一项实践性很强的技能代码不是看会的而是敲会的。建议你跟着本文的代码一块一块运行看到输出结果后再继续下一个知识点。如果这篇文章对你有帮助欢迎收藏备用你在实际运行中踩到什么坑也欢迎在评论区留言我们一起交流。
返回列表