尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python数据分析实战:从零构建NumPy与Pandas核心技能栈

Python数据分析实战:从零构建NumPy与Pandas核心技能栈 很多想学数据分析的朋友第一反应就是去搜“Python数据分析教程”。结果往往是看了半天Python基础语法对数据分析还是无从下手或者跟着教程装了一堆库却连一个完整的数据清洗流程都跑不通。问题出在哪大多数教程把“Python语法”和“数据分析”割裂了。你学了变量、循环但不知道numpy的数组和Python列表到底有什么区别更不明白pandas的DataFrame为什么是数据分析的基石。这种脱节让你感觉学了很多却做不了事。这篇文章要解决的就是这个问题。我们不搞大而全的语法手册而是围绕“数据分析”这个目标重构学习路径。从安装Python开始到写出第一个数据分析脚本每一个环节都紧扣“用Python处理数据”这个核心。你会清晰地看到基础语法如何支撑numpy的高效计算numpy又如何为pandas的强大功能铺路。读完本文你将获得一条从零到一的清晰路径环境搭建 → 核心语法聚焦数据操作→ numpy数组计算 → pandas数据分析实战。更重要的是你会理解每个工具在数据分析链条中的位置避开“学完就忘、无法应用”的陷阱。如果你曾被零散的知识点困扰那么这篇文章就是为你准备的导航图。1. 为什么传统的学习路径让你效率低下在开始具体操作之前我们必须先理清一个核心误区为什么很多人学了很久Python却依然做不了数据分析根本原因在于学习目标与学习内容的错配。你的目标是“用Python分析数据”但多数教程的起点是“掌握Python编程语言”。这导致了两个典型问题知识孤立你学了for循环但不知道如何用它遍历Excel表的每一行你学了列表但面对几万条数据时用纯列表操作慢得让你怀疑人生。因为你学的语法没有立刻和数据这个“上下文”绑定。工具链断裂Python、numpy、pandas被当作三个独立的课程。实际上它们是一个紧密协作的“技术栈”。pandas内部依赖numpy进行高速计算而numpy的很多思想又建立在Python基础语法之上。不理解这个依赖关系你就无法灵活运用。本文采用的“目标导向”路径则完全不同我们以“完成一次数据分析”为终点反向推导需要学习的内容。这意味着学变量和数据类型是为了理解数据在程序中的形态。学if和while循环是为了实现数据筛选和迭代处理。学函数是为了封装重复的数据处理逻辑让脚本更清晰。学numpy是为了获得处理数值型数据的“超级引擎”解决纯Python速度慢的问题。学pandas是为了拥有一个结构化的、类似数据库表格的数据容器它是我们进行数据清洗、转换、分析和可视化的主战场。这个路径的每一步都直指目标让你感受到即时的反馈和成就感这才是高效学习的关键。2. 环境准备搭建专属的数据分析工作台工欲善其事必先利其器。一个稳定、便捷的开发环境能极大提升学习效率和体验。对于数据分析新手我们推荐最主流的组合Python Jupyter Notebook 关键库。2.1 安装Python访问Python官网https://www.python.org/downloads/下载最新稳定版本如Python 3.11或3.12。安装时请务必勾选“Add python.exe to PATH”这能让你在命令行中直接使用python命令。安装完成后打开命令行Windows上是CMD或PowerShellMac/Linux上是Terminal输入以下命令验证python --version如果正确显示版本号如Python 3.11.5说明安装成功。2.2 安装必备工具与库我们将使用pipPython的包管理工具来安装所需的库。在命令行中依次执行以下命令# 升级pip到最新版本 python -m pip install --upgrade pip # 安装数据分析核心三件套numpy, pandas, matplotlib (用于绘图) pip install numpy pandas matplotlib # 安装Jupyter Notebook这是一个交互式编程环境非常适合数据探索和分析 pip install notebook安装过程可能会持续几分钟取决于你的网络速度。2.3 启动你的第一个分析环境安装完成后在命令行中进入你计划存放数据分析项目的目录然后启动Jupyter Notebook# 切换到你的工作目录例如 cd D:\MyDataAnalysisProjects # 启动Jupyter Notebook jupyter notebook执行后你的默认浏览器会自动打开一个本地页面通常是http://localhost:8888这就是Jupyter Notebook的工作界面。点击右上角的“New” - “Python 3”即可创建一个新的Notebook文件后缀为.ipynb。为什么选择Jupyter Notebook在数据分析中我们经常需要“探索式”编程执行一段代码立即看到结果比如数据的前几行然后基于结果决定下一步操作。Jupyter Notebook将代码分成独立的“单元格”Cell你可以单独运行任何一个单元格结果会直接显示在下方。这种交互特性让它成为数据科学家和数据分析师的首选工具。至此你的数据分析“工作台”已经搭建完毕。接下来我们将在Notebook中开始真正的学习。3. Python核心语法只为数据分析服务我们不会面面俱到只聚焦于数据分析中最常用、最关键的语法点。请在刚才创建的Notebook中跟随示例一起操作。3.1 变量与数据类型理解数据的“容器”数据在Python中必须被存放在“容器”里这就是变量。而数据类型决定了容器能装什么、能做什么。# 单元格1变量与基本数据类型 # 数字 (用于计算) age 25 price 19.99 # 字符串 (用于文本) name 张三 # 布尔值 (用于逻辑判断) is_student True print(年龄:, age, 类型:, type(age)) print(姓名:, name, 类型:, type(name)) print(是否是学生:, is_student, 类型:, type(is_student)) # 列表 (List)有序、可变的集合是数据分析前最常用的原始数据容器 scores [85, 90, 78, 92, 88] fruits [apple, banana, orange] print(成绩列表:, scores) print(第一个成绩:, scores[0]) # 索引从0开始 print(最后两个成绩:, scores[-2:]) # 切片操作数据分析视角原始数据如从CSV读取的一列数字最初往往以列表形式存在。理解列表的索引和切片是后续学习numpy和pandas数据选取的基础。3.2 循环与条件判断实现数据处理的自动化数据分析中经常需要对大量数据进行筛选、分类或逐条处理。# 单元格2while循环与条件判断 # 场景模拟一个简单的数据过滤过程只保留及格60的成绩 raw_scores [45, 89, 56, 72, 90, 58, 61] passing_scores [] # 创建一个空列表存放及格成绩 index 0 while index len(raw_scores): # len() 获取列表长度 score raw_scores[index] if score 60: passing_scores.append(score) # append() 向列表末尾添加元素 print(f成绩 {score} 及格已收录。) else: print(f成绩 {score} 不及格已过滤。) index 1 # 千万不要忘记让索引递增否则会陷入无限循环 print(所有及格成绩:, passing_scores) # 更Pythonic的写法使用 for 循环更常用 passing_scores_for [] for score in raw_scores: if score 60: passing_scores_for.append(score) print((使用for循环)及格成绩:, passing_scores_for)关键点while循环适用于不确定循环次数的场景但必须确保循环条件最终会变为False否则就是“死循环”。上例中index 1就是关键。if判断实现业务逻辑的核心。在数据分析中它对应着数据清洗时的“条件过滤”。for循环遍历集合如列表的首选更简洁不易出错。在数据分析中for循环可能直接用于处理数据行但在pandas中我们更多使用向量化操作来替代显式循环效率更高。3.3 函数封装你的数据分析逻辑当某段数据处理代码需要重复使用时就应该把它写成函数。# 单元格3函数 - 创建可复用的数据处理模块 def calculate_statistics(data_list): 计算一个数值列表的基本统计量总和、平均值、最大值、最小值。 参数: data_list: 一个包含数字的列表。 返回: 一个包含统计量的字典。 if not data_list: # 检查列表是否为空 return {总和: None, 平均值: None, 最大值: None, 最小值: None} total sum(data_list) average total / len(data_list) max_val max(data_list) min_val min(data_list) return { 总和: total, 平均值: average, 最大值: max_val, 最小值: min_val } # 使用函数分析不同的数据集 monthly_sales [12000, 15000, 11000, 18000, 20000] stats calculate_statistics(monthly_sales) print(月度销售数据统计:) for key, value in stats.items(): print(f {key}: {value}) # 另一个数据集 test_scores [78, 85, 92, 65, 88] print(\n测试成绩统计:, calculate_statistics(test_scores))为什么重要在真实的数据分析项目中数据清洗、特征计算等步骤往往被写成独立的函数。这使你的代码结构清晰、易于维护和测试。pandas本身也提供了大量类似mean(),sum()的函数。4. NumPy高性能数值计算的基石当数据量变大时Python原生的列表操作会变得非常慢。NumPyNumerical Python应运而生它提供了强大的多维数组对象和一系列高效函数是pandas和许多科学计算库的底层引擎。4.1 从列表到NumPy数组维度的飞跃# 单元格4引入NumPy并创建数组 import numpy as np # 惯例将numpy简写为np # 从列表创建一维数组 list_data [1, 2, 3, 4, 5] np_array_1d np.array(list_data) print(Python列表:, list_data, type(list_data)) print(NumPy一维数组:, np_array_1d, type(np_array_1d)) print(数组形状:, np_array_1d.shape) # (5,) 表示5个元素的一维数组 print(数组数据类型:, np_array_1d.dtype) # int64 # 创建二维数组矩阵 matrix_data [[1, 2, 3], [4, 5, 6], [7, 8, 9]] np_array_2d np.array(matrix_data) print(\n二维数组:\n, np_array_2d) print(形状:, np_array_2d.shape) # (3, 3) 3行3列 print(数据类型:, np_array_2d.dtype)核心区别列表可以存放不同类型的数据如[1, a, True]灵活但效率低。NumPy数组要求所有元素类型相同通常是数字存储在连续的内存中。这种同质性和连续性使得NumPy能调用底层C语言编写的优化函数进行向量化操作速度比Python循环快数十甚至数百倍。4.2 向量化操作告别低效循环这是NumPy的灵魂。你可以直接对整个数组进行数学运算而无需编写循环。# 单元格5NumPy的向量化运算 arr np.array([10, 20, 30, 40, 50]) # 标量运算数组中的每个元素都进行相同操作 print(每个元素加5:, arr 5) print(每个元素乘2:, arr * 2) print(每个元素平方:, arr ** 2) # 数组间运算对应位置的元素进行计算 arr_b np.array([1, 2, 3, 4, 5]) print(\n数组相加对应元素:, arr arr_b) print(数组相乘:, arr * arr_b) # 比较运算返回布尔值数组 print(\n元素是否大于25:, arr 25) # 这个布尔数组可用于高级索引筛选 print(大于25的元素:, arr[arr 25])数据分析意义数据清洗和特征工程中经常需要对整列数据进行统一的变换如归一化、取对数。用NumPy向量化操作一行代码就能完成简洁且高效。4.3 常用数组操作与函数# 单元格6常用NumPy函数 arr np.array([[8, 1, 7], [3, 9, 2], [5, 4, 6]]) # 聚合函数 print(整个数组的和:, np.sum(arr)) print(每列的平均值:, np.mean(arr, axis0)) # axis0 沿列方向 print(每行的最大值:, np.max(arr, axis1)) # axis1 沿行方向 print(数组的标准差:, np.std(arr)) # 重塑数组形状 arr_flat arr.flatten() # 展平为一维 print(\n展平后的数组:, arr_flat) arr_reshaped arr_flat.reshape(3, 3) # 重塑为3x3 print(重塑后的数组:\n, arr_reshaped) # 生成特定数组 zeros_arr np.zeros((2, 4)) # 2行4列的零矩阵 ones_arr np.ones((3, 2)) # 3行2列的单位矩阵 range_arr np.arange(0, 10, 2) # 从0开始步长为2小于10 print(\n零矩阵:\n, zeros_arr) print(单位矩阵:\n, ones_arr) print(范围数组:, range_arr)掌握这些基础操作你就已经具备了使用pandas所需的NumPy知识。pandas的Series和DataFrame底层就是基于NumPy数组构建的。5. Pandas数据分析的终极武器如果说NumPy是高效的“砖块”那么pandas就是用这些砖块建造的、功能齐全的“数据分析大厦”。它的核心是两种数据结构Series一维带标签数组和DataFrame二维表格型数据结构。DataFrame是绝大多数数据分析任务的起点和终点。5.1 创建与查看DataFrame# 单元格7引入pandas并创建第一个DataFrame import pandas as pd # 惯例将pandas简写为pd # 从字典创建DataFrame键是列名值是列数据列表 data { 姓名: [张三, 李四, 王五, 赵六], 年龄: [28, 34, 23, 45], 城市: [北京, 上海, 广州, 深圳], 月薪: [15000, 22000, 12000, 30000] } df pd.DataFrame(data) print(完整的DataFrame:) print(df) print(\nDataFrame的信息:) print(df.info()) # 查看列名、非空值数量、数据类型 print(\nDataFrame的描述性统计数值列:) print(df.describe()) # 快速获取计数、均值、标准差、分位数等 # 查看数据头部和尾部 print(\n前2行:) print(df.head(2)) print(\n后2行:) print(df.tail(2))5.2 数据选取与过滤这是数据分析中最频繁的操作。# 单元格8数据选取与过滤 # 1. 选取列 print(选取‘姓名’和‘月薪’两列:) print(df[[姓名, 月薪]]) # 注意是两层方括号 # 2. 按位置选取行 (使用iloc) print(\n选取第1行到第2行不含第3行:) print(df.iloc[1:3]) # 行索引从0开始切片左闭右开 # 3. 按标签选取行 (使用loc) - 更常用 print(\n选取‘姓名’为‘李四’的行:) print(df.loc[df[姓名] 李四]) # 4. 复杂条件过滤 print(\n选取‘月薪’大于15000且‘年龄’小于40的行:) condition (df[月薪] 15000) (df[年龄] 40) print(df.loc[condition]) # 5. 选取特定行和列的组合 print(\n选取‘李四’和‘王五’的‘姓名’和‘城市’:) selected_rows df[姓名].isin([李四, 王五]) print(df.loc[selected_rows, [姓名, 城市]])5.3 数据处理清洗、转换与计算真实数据往往是脏乱的pandas提供了强大的工具进行清洗。# 单元格9数据处理实战 # 创建一个有问题的数据集 data_dirty { 产品: [A, B, C, D, E], 销量: [120, 150, None, 180, 200], # 包含缺失值 单价: [10.5, 12.0, 8.5, 15.0, 9.8], 折扣: [0.1, 0.0, 0.15, None, 0.05] # 包含缺失值 } df_dirty pd.DataFrame(data_dirty) print(原始脏数据:) print(df_dirty) # 1. 处理缺失值 print(\n1. 检查缺失值:) print(df_dirty.isnull().sum()) # 统计每列的缺失值数量 # 填充缺失值用均值或中位数填充数值列用众数或特定值填充分类列 df_dirty[销量].fillna(df_dirty[销量].mean(), inplaceTrue) # 用均值填充销量 df_dirty[折扣].fillna(0, inplaceTrue) # 假设缺失的折扣为0 print(\n填充缺失值后:) print(df_dirty) # 2. 创建新列特征工程 df_dirty[销售额] df_dirty[销量] * df_dirty[单价] * (1 - df_dirty[折扣]) print(\n计算‘销售额’后:) print(df_dirty) # 3. 数据排序 print(\n按‘销售额’降序排列:) print(df_dirty.sort_values(by销售额, ascendingFalse)) # 4. 分组聚合类似SQL的GROUP BY print(\n按‘产品’首字母分组模拟分类计算平均单价和总销售额:) df_dirty[产品大类] df_dirty[产品].apply(lambda x: Group1 if x in [A,B,C] else Group2) grouped df_dirty.groupby(产品大类).agg({ 单价: mean, 销售额: sum }) print(grouped)5.4 数据读取与保存数据分析的数据通常来自外部文件。# 单元格10读写数据文件 # 假设我们有一个CSV文件 sales_data.csv内容如下 # 日期,产品,销量,单价 # 2023-01-01,A,100,10.5 # 2023-01-01,B,150,12.0 # 2023-01-02,A,120,10.5 # 2023-01-02,C,80,8.5 # 读取CSV文件 # df_from_csv pd.read_csv(sales_data.csv) # print(df_from_csv) # 为了演示我们直接创建一个同结构的DataFrame并保存 df_to_save pd.DataFrame({ 日期: [2023-01-01, 2023-01-01, 2023-01-02, 2023-01-02], 产品: [A, B, A, C], 销量: [100, 150, 120, 80], 单价: [10.5, 12.0, 10.5, 8.5] }) # 保存到CSV df_to_save.to_csv(sales_data_demo.csv, indexFalse) # indexFalse表示不保存行索引 print(数据已保存到 sales_data_demo.csv) # 同样可以读取和保存Excel文件 (需要安装 openpyxl 或 xlrd 库) # pip install openpyxl # df_excel pd.read_excel(data.xlsx, sheet_nameSheet1) # df.to_excel(output.xlsx, indexFalse)至此你已经掌握了使用pandas进行数据分析的核心操作链读取 → 查看 → 过滤 → 清洗 → 计算 → 保存。6. 综合实战一个完整的数据分析小项目让我们把前面所有知识串联起来完成一个模拟的真实任务。任务分析一家咖啡店一周的销售数据计算每日总销售额、最畅销产品并找出销售额低于平均水平的日期。# 单元格11综合实战项目 import pandas as pd import numpy as np # 1. 创建模拟数据 np.random.seed(42) # 固定随机种子确保结果可复现 days [周一, 周二, 周三, 周四, 周五, 周六, 周日] products [美式咖啡, 拿铁, 卡布奇诺, 摩卡, 绿茶] # 生成随机销售数据 data [] for day in days: for product in products: # 模拟销量和单价 sales np.random.randint(20, 100) price np.random.choice([25, 30, 35, 28, 22]) data.append([day, product, sales, price]) df_coffee pd.DataFrame(data, columns[星期, 产品, 销量, 单价(元)]) df_coffee[销售额] df_coffee[销量] * df_coffee[单价(元)] print(1. 原始销售数据前10行:) print(df_coffee.head(10)) # 2. 数据分析 print(\n2. 数据分析结果:) # 2.1 每日总销售额 daily_sales df_coffee.groupby(星期)[销售额].sum().sort_values(ascendingFalse) print(每日总销售额降序:) print(daily_sales) print(f\n销售额最高的一天是: {daily_sales.idxmax()} 销售额为 {daily_sales.max():.2f} 元) # 2.2 最畅销产品按总销量 product_popularity df_coffee.groupby(产品)[销量].sum().sort_values(ascendingFalse) print(\n产品总销量排名:) print(product_popularity) print(f\n最畅销的产品是: {product_popularity.idxmax()}) # 2.3 找出销售额低于平均水平的日期 avg_daily_sales daily_sales.mean() low_sales_days daily_sales[daily_sales avg_daily_sales] print(f\n日均销售额: {avg_daily_sales:.2f} 元) print(销售额低于平均水平的日期:) print(low_sales_days) # 3. 数据可视化 (简单文本图表) print(\n3. 每日销售额条形图文本模拟:) max_bar_length 40 max_sales daily_sales.max() for day, sales in daily_sales.items(): bar_length int((sales / max_sales) * max_bar_length) bar █ * bar_length print(f{day}: {bar} {sales:.0f}元)这个项目虽然数据是模拟的但它完整地走了一遍数据分析的标准流程构造/获取数据 → 数据整合与计算 → 分组聚合分析 → 得出业务结论。你可以尝试修改数据或分析维度比如按产品分析毛利率、分析周末和工作日的销售差异等。7. 常见问题与排查思路在学习过程中你几乎一定会遇到下面这些问题。这里提供了清晰的排查路径。问题现象可能原因排查方式解决方案ModuleNotFoundError: No module named numpy1.numpy未安装。2. 安装了多个Python环境当前环境没有该库。3. IDE如PyCharm、VSCode使用的解释器不对。1. 在命令行输入pip list查看已安装的包列表。2. 在命令行输入python -c import sys; print(sys.executable)确认当前Python解释器路径。1. 在正确的Python环境下执行pip install numpy pandas。2. 在IDE中检查并切换项目解释器到已安装库的环境。AttributeError: module numpy has no attribute arange最常见原因将文件或文件夹命名为了numpy.py。Python会优先导入当前目录下的numpy.py而不是真正的库。检查当前工作目录下是否有numpy.py或numpy文件夹。立即重命名你的文件或文件夹不要使用numpy,pandas,matplotlib等库名作为文件名。error occurred when installing package pandas1. 网络问题。2. 依赖冲突如numpy版本不兼容。3. 缺少编译环境Windows上常见。1. 检查网络或使用国内镜像源pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple。2. 查看错误详情看是否与numpy版本有关。1. 使用镜像源安装。2. 尝试先升级pip和setuptools。3. 对于复杂环境可使用conda管理。RuntimeError: numpy was built with baseline optimizationsnumpy版本与系统CPU指令集不兼容。通常发生在老旧CPU或特定版本组合下。确认你的Python和numpy版本。降级到一个更通用的numpy版本例如pip install numpy1.24.3。KeyError当使用df[列名]时指定的列名在DataFrame中不存在。可能是拼写错误、大小写不一致或列名包含空格。使用print(df.columns)打印所有列名仔细核对。1. 修正列名拼写。2. 使用df.get(列名, defaultNone)安全获取。使用df.loc或df.iloc时结果不对或报错混淆了loc基于标签和iloc基于整数位置的用法。loc使用行/列的名称index/column labelsiloc使用从0开始的整数位置。明确你的意图要按名字选就用loc要按位置选就用iloc。例如df.iloc[0]选第一行df.loc[row_label]选标签为row_label的行。读取CSV/Excel文件时编码错误或乱码文件保存的编码格式如gbk,utf-8,utf-8-sig与pandas默认读取编码(utf-8)不一致。用文本编辑器如VS Code, Notepad打开文件查看右下角显示的编码。在read_csv中指定编码pd.read_csv(file.csv, encodinggbk)或encodingutf-8-sig。SettingWithCopyWarning警告对DataFrame切片后的副本进行赋值操作pandas无法确定你是想修改原始数据还是副本。这是一个警告不是错误但可能导致意想不到的行为。1. 如果明确要修改原始数据使用.loc或.iloc进行索引赋值df.loc[mask, column] value。2. 如果明确要操作副本先使用.copy()df_copy df[mask].copy()。8. 最佳实践与学习建议掌握工具后如何用得更好、学得更深以下建议来自实际项目经验。理解而非死记不要背诵pandas的几十个函数。理解核心概念DataFrame是带行列索引的表格Series是带索引的列。大部分操作都围绕索引、选择、分组、聚合展开。理解了这些API查文档就能用。善用官方文档与社区pandas和numpy的官方文档非常优秀。遇到不熟悉的函数第一时间去查官方文档。遇到具体问题在Stack Overflow或CSDN上搜索错误信息大概率已有解决方案。从模仿到创造初期多找高质量的数据分析项目代码如Kaggle Notebooks, GitHub项目阅读和模仿。看别人如何组织代码、处理数据、进行分析。然后尝试用自己的数据复现类似分析。代码风格与可读性命名变量名使用有意义的英文如daily_sales而不是ds。注释为复杂的处理逻辑写注释说明“为什么”这么做。函数化将超过5行的重复数据处理逻辑封装成函数。探索性步骤放在Jupyter中将最终的数据清洗、分析流程整理成独立的.py脚本便于复用和自动化。性能意识对大数据集万行以上尽量避免在pandas中使用for循环。优先使用向量化操作NumPy/pandas内置函数和.apply()方法。如果实在需要循环考虑使用.itertuples()替代.iterrows()速度更快。版本管理使用requirements.txt文件记录项目依赖库的版本确保环境可复现。# 生成 requirements.txt pip freeze requirements.txt # 在新环境安装 pip install -r requirements.txt下一步学习方向数据可视化深入学习matplotlib和seaborn让分析结果更直观。数据获取学习使用requests进行网络爬虫或sqlalchemy连接数据库。统计分析结合scipy、statsmodels进行假设检验、回归分析等。机器学习使用scikit-learn在清洗好的数据上进行建模预测。这条路从环境搭建开始途经Python核心语法聚焦数据操作深入numpy的向量化世界最终在pandas的DataFrame中完成数据分析的闭环。每一个环节都瞄准“处理数据”这个靶心避免了知识的散弹式学习。真正掌握数据分析不在于记住所有函数而在于建立起“数据流”的思维数据从哪里来要经历怎样的清洗和转换最终去向哪里如何回答业务问题。本文提供的代码和项目就是你构建这种思维的第一块积木。建议你将文章中的代码在Jupyter Notebook中逐行运行、修改、调试直到完全理解。当你能够独立完成一个从数据加载到得出洞察的小项目时你就已经跨过了从零到一最关键的门槛。
返回列表