Python数据分析期末复习:Numpy、Pandas与Matplotlib核心要点精讲 1. 项目概述为什么期末复习需要一份“归纳”又到期末了如果你是计算机、统计、金融或者任何和数据沾边的专业大概率逃不掉一门叫“Python数据分析”的课。这门课的特点就是知识点零散、库多、函数杂平时写作业调包调得飞起一到考试就发现连DataFrame的索引是iloc还是loc都记混了。我当年也这么过来的所以特别理解大家考前那种“好像都会又好像都不会”的焦虑感。这份“期末复习归纳”不是给你一本全新的教材而是帮你把一学期学过的、最核心、最高频、最容易混淆的知识点像整理房间一样分门别类地归置好。它的核心价值在于“提纯”和“串联”。提纯是过滤掉那些不常用的细枝末节只留下考试和实际项目中最可能用到的“硬通货”串联是把Numpy、pandas、matplotlib这几个看似独立的库通过一个数据分析的完整流程数据加载、清洗、探索、可视化给串起来让你明白它们各自在哪个环节发挥作用而不是孤立地记忆。简单说这份归纳适合两类人一是正在备考急需一份高效复习提纲的同学二是学完一遍感觉知识点像一盘散沙想重新建立知识体系的朋友。我会用最直白的“人话”结合我踩过的坑和项目里的实际经验带你快速过一遍重点。咱们的目标不是面面俱到而是用最短的时间拿到最关键的分数并建立起能用于实战的认知框架。2. 核心基石Numpy的数组世界与高效计算数据分析的所有高级操作底层几乎都离不开高效的数值计算这就是Numpy的舞台。别被它“科学计算库”的名头吓到期末考和日常用你只需要抓住几个核心概念。2.1 数组创建、索引与形状操作Numpy的核心是ndarrayN维数组。它和Python原生列表最大的区别在于同质所有元素类型相同和高效底层用C实现。创建数组最常用的就几个函数import numpy as np # 从列表创建 arr1 np.array([1, 2, 3, 4]) # 创建特殊数组 zeros_arr np.zeros((3, 4)) # 3行4列的全0数组 ones_arr np.ones((2, 2)) range_arr np.arange(0, 10, 2) # 类似range但生成数组 linspace_arr np.linspace(0, 1, 5) # 0到1之间均匀取5个数这里有个实操心得np.arange和np.linspace经常搞混。记住arange是给定start, stop, step像rangelinspace是给定start, stop, num元素个数它帮你均匀分。画坐标轴刻度时linspace更常用。索引和切片是操作数组的命脉和列表类似但功能更强尤其是“布尔索引”和“花式索引”。arr np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 普通索引和切片 print(arr[0, 1]) # 2 print(arr[1:, :2]) # 第二行开始所有行的前两列 - [[4,5], [7,8]] # 布尔索引极其重要 mask arr 5 print(arr[mask]) # 输出所有大于5的元素 - [6, 7, 8, 9] # 花式索引 print(arr[[0, 2], [0, 1]]) # 取(0,0)和(2,1)位置的值 - [1, 8]重要注意事项Numpy的切片返回的是“视图”view而不是副本copy。这意味着如果你修改了切片原始数组也会被修改这既是优点节省内存也是坑。如果不想影响原数组记得用.copy()方法显式复制。形状操作是另一大重点。.reshape、.resize、.flatten、.T转置这些方法必须熟练。arr np.arange(12) reshaped arr.reshape(3, 4) # 改为3行4列元素总数必须匹配 flattened reshaped.flatten() # 展平为一维 transposed reshaped.T # 转置行变列常见问题reshape不改变原数组返回新数组resize则直接修改原数组形状如果新形状元素更多会填充0或重复原数组。考试常考reshape(-1, 1)或reshape(1, -1)的用法-1代表自动计算该维度长度用于将一维数组转为列向量或行向量在机器学习特征处理中非常常见。2.2 通用函数、广播机制与聚合计算Numpy的通用函数ufunc是对数组进行元素级运算的快速函数。比如np.sqrt(arr)、np.exp(arr)、np.sin(arr)。它们比用Python循环快几个数量级。广播Broadcasting是Numpy最强大也最容易出错的概念之一。它的核心规则是当两个数组形状不同时Numpy会尝试通过扩展维度或复制数据使它们形状兼容从而进行元素级运算。规则可以简化为从尾部维度开始对齐。维度大小为1的轴可以被扩展为对方对应维度的大小。如果某个维度缺失可以视为1。# 经典例子 A np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3) B np.array([10, 20, 30]) # 形状 (3,) # B被广播为 [[10,20,30], [10,20,30]]形状变为(2,3)然后与A相加 C A B # 结果[[11,22,33], [14,25,36]]避坑技巧当你对广播结果不确定时一个笨但有效的方法是在脑子里或纸上把两个数组的形状写出来从右向左对齐然后逐条套用广播规则。多练几个例子感觉就来了。聚合计算是数据分析的汇总统计Numpy提供了sum、mean、std标准差、var方差、min、max、argmin最小值索引、argmax最大值索引等函数。关键是要掌握axis参数。arr np.array([[1, 2], [3, 4], [5, 6]]) print(arr.sum()) # 所有元素和 - 21 print(arr.sum(axis0)) # 沿第0轴行压缩计算每列的和 - [9, 12] print(arr.sum(axis1)) # 沿第1轴列压缩计算每行的和 - [3, 7, 11]记忆口诀axis0就是“沿着行的方向往下压”行没了剩下列所以是跨行计算列方向。axis1反之。pandas里也沿用这个逻辑。3. 数据操纵核心pandas的DataFrame与Series如果说Numpy是高效的“发动机”那pandas就是舒适的“驾驶舱”。它提供了Series一维带标签数组和DataFrame二维表格可视为Series的字典这两种核心数据结构让数据操作变得直观。3.1 数据结构、数据读写与查看Series可以看作一个带索引的字典。DataFrame是多个共享同一个索引的Series的集合。import pandas as pd # 创建Series s pd.Series([1, 3, 5, np.nan, 6], index[a, b, c, d, e]) # 创建DataFrame df pd.DataFrame({ 姓名: [张三, 李四, 王五], 年龄: [20, 21, 19], 成绩: [88.5, 92.0, 85.0] }, index[S001, S002, S003]) # 可以指定行索引数据读写是第一步。最常用的是read_csv和to_csv。# 读取 df pd.read_csv(data.csv, encodingutf-8) # 注意编码问题 # 读取Excel df_excel pd.read_excel(data.xlsx, sheet_nameSheet1) # 写入 df.to_csv(output.csv, indexFalse) # 通常不保存行索引常见问题与排查read_csv报编码错误尝试encodinggbk、gb2312或utf-8-sig。用chardet库检测文件编码是个好习惯。读取时列名有空格或奇怪字符用df.columns df.columns.str.strip()清理或用rename方法重命名。内存不足对于大文件使用chunksize参数分块读取或指定usecols只读需要的列指定dtype优化数据类型。查看数据的基本方法必须熟记于心这是探索数据的第一步df.head()/df.tail()看头尾几行。df.info()看列名、非空值数量、数据类型。这是你拿到新数据后第一个应该调用的方法能快速了解数据全貌和潜在问题如缺失值、类型错误。df.describe()生成数值型列的统计摘要计数、均值、标准差、最小值、四分位数、最大值。df.shape返回行数 列数。df.columns列名列表。df.index行索引。3.2 数据索引、选取与过滤这是pandas操作的重中之重也是考试高频区。主要分为基于标签的.loc和基于整数位置的.iloc。# .loc 基于标签 print(df.loc[S001]) # 选取索引为S001的行 print(df.loc[S001:S002, 姓名:成绩]) # 行、列切片闭区间 print(df.loc[df[年龄] 20, [姓名, 成绩]]) # 布尔索引与列筛选结合 # .iloc 基于整数位置 print(df.iloc[0]) # 第一行 print(df.iloc[0:2, 1:3]) # 前两行第2到3列左闭右开 # 直接索引容易混淆慎用 print(df[姓名]) # 取单列返回Series print(df[[姓名, 成绩]]) # 取多列返回DataFrame print(df[0:2]) # 行切片基于整数位置重要注意事项.loc是闭区间[start:end]而.iloc是Python标准的左闭右开区间[start:end)。这是最常见的错误来源之一。我的建议是除非非常简单的情况否则统一使用.loc和.iloc放弃直接索引的行切片概念更清晰。布尔过滤是数据清洗和探索的灵魂。你需要熟练使用比较运算符, , , !、逻辑运算符与、|或、~非以及isin()、str.contains()等方法。# 筛选年龄大于20且成绩大于90的学生 condition (df[年龄] 20) (df[成绩] 90) filtered_df df[condition] # 筛选姓名包含“三”或“四”的学生 name_condition df[姓名].str.contains(三|四) # 筛选姓名在某个列表里的学生 list_condition df[姓名].isin([张三, 王五])避坑技巧进行多个条件的布尔运算时每个条件必须用括号()括起来否则会因为运算符优先级问题导致错误。这是新手必踩的坑。3.3 数据清洗处理缺失值与重复值真实数据没有完美的清洗是数据分析耗时最长的步骤之一。处理缺失值pandas用NaNNot a Number表示缺失。常用方法df.isnull()/df.notnull()检测缺失值返回布尔矩阵。df.dropna()删除含有缺失值的行或列axis参数。df.fillna(value)用指定值填充缺失值。value可以是一个标量、字典不同列用不同值、或使用前向/后向填充methodffill或bfill。# 删除所有包含缺失值的行 df_cleaned df.dropna() # 用该列的平均值填充‘成绩’列的缺失值 df[成绩].fillna(df[成绩].mean(), inplaceTrue) # 用前一个有效值向前填充 df.fillna(methodffill, inplaceTrue)实操心得不要一上来就dropna这可能会丢失大量有价值的数据。先看缺失比例df.isnull().sum() / len(df)如果某列缺失超过50%可以考虑删除该列如果某行缺失关键信息再删除行。对于数值列常用均值、中位数填充对于类别列常用众数填充。inplaceTrue表示原地修改慎用建议先赋值给新变量观察效果。处理重复值df.duplicated()标记重复行。df.drop_duplicates()删除重复行。可以通过subset参数指定依据哪些列判断重复keep参数决定保留第一个还是最后一个。# 删除完全重复的行 df_unique df.drop_duplicates() # 根据‘姓名’列去重保留第一次出现的记录 df_unique_by_name df.drop_duplicates(subset[姓名], keepfirst)3.4 数据转换类型转换、字符串操作与apply函数类型转换使用astype()方法。df[年龄] df[年龄].astype(int32) # 将字符串转换为日期时间 df[日期列] pd.to_datetime(df[日期列])字符串操作通过.str访问器可以方便地使用向量化的字符串方法避免循环。df[姓名] df[姓名].str.upper() # 大写 df[姓名] df[姓名].str.strip() # 去空格 df[邮箱域名] df[邮箱].str.split().str[1] # 提取域名apply函数当内置的向量化操作无法满足复杂逻辑时apply是你的瑞士军刀。它可以对Series或DataFrame的行/列应用一个自定义函数。# 对‘成绩’列应用一个函数将成绩转换为等级 def grade_to_level(score): if score 90: return A elif score 80: return B else: return C df[等级] df[成绩].apply(grade_to_level) # 对每一行应用函数axis1 df[综合信息] df.apply(lambda row: f{row[姓名]}-{row[年龄]}, axis1)注意事项apply虽然灵活但性能上不如pandas内置的向量化操作。对于大数据集能不用apply就不用优先寻找向量化解决方案。lambda表达式在这里非常常用。3.5 数据分组与聚合groupby的魔法groupby是pandas最强大的功能之一它遵循“拆分-应用-合并”的模式。# 按‘班级’分组计算每班的平均成绩 grouped df.groupby(班级) avg_score_by_class grouped[成绩].mean() # 一次进行多个聚合计算 agg_result grouped[成绩].agg([mean, std, max, min]) # 对不同列进行不同聚合 agg_result2 grouped.agg({成绩: mean, 年龄: max}) # 分组后过滤筛选出组内平均成绩大于85的班级 filtered_groups grouped.filter(lambda x: x[成绩].mean() 85)核心理解df.groupby(key)产生的是一个DataFrameGroupBy对象它还没有进行实际计算。只有当你对这个对象调用聚合函数mean,sum,count等或应用其他操作时计算才会发生。你可以把它想象成一个惰性计算的“视图”。常见问题分组后索引变成了分组键。如果想将分组键变回普通列使用reset_index()方法agg_result.reset_index()。3.6 数据合并与连接merge与concat数据分析常常需要整合多个数据源。pd.concat主要用于沿轴行或列堆叠多个DataFrame或Series。df1 pd.DataFrame({A: [A0, A1], B: [B0, B1]}) df2 pd.DataFrame({A: [A2, A3], B: [B2, B3]}) result pd.concat([df1, df2], ignore_indexTrue) # 纵向堆叠忽略原索引pd.merge基于一个或多个键将不同DataFrame中的行连接起来类似于SQL的JOIN操作。left pd.DataFrame({key: [K0, K1, K2], A: [A0, A1, A2]}) right pd.DataFrame({key: [K0, K1, K3], B: [B0, B1, B3]}) # 内连接默认 inner_join pd.merge(left, right, onkey) # 左连接 left_join pd.merge(left, right, onkey, howleft) # 外连接 outer_join pd.merge(left, right, onkey, howouter)如何选择简单堆叠用concat基于共同列键关联行用merge。merge的参数how决定了连接类型inner,left,right,outeron指定连接键如果左右键名不同用left_on和right_on。4. 数据可视化matplotlib与pandas绘图数据分析的结果最终要靠图表说话。matplotlib是绘图的基础库pandas的plot方法对其进行了封装更方便。4.1 基础绘图流程与图形元素一个最基本的matplotlib绘图流程如下import matplotlib.pyplot as plt # 1. 准备数据 x [1, 2, 3, 4, 5] y [2, 4, 6, 8, 10] # 2. 创建图形和坐标轴 fig, ax plt.subplots(figsize(8, 6)) # fig是画布ax是坐标系 # 3. 在坐标轴上绘图 ax.plot(x, y, markero, linestyle--, colorb, label线性增长) # 或使用pandas的plot接口更简洁 # df[成绩].plot(kindline, axax) # 4. 设置图形元素 ax.set_xlabel(X轴标签) ax.set_ylabel(Y轴标签) ax.set_title(我的第一个图表) ax.legend() # 显示图例 ax.grid(True, linestyle:, alpha0.5) # 显示网格线 # 5. 显示或保存图形 plt.tight_layout() # 自动调整子图参数使之填充整个图像区域 plt.savefig(my_plot.png, dpi300) # 保存高清图 plt.show()核心概念Figure整个画布可以包含多个Axes。Axes坐标系一个具体的图形如折线图、柱状图就画在一个Axes上。我们绝大多数操作都是在Axes对象上例中的ax上进行的。Axis坐标轴。实操心得我强烈推荐使用面向对象的写法fig, ax plt.subplots()而不是plt.plot()、plt.xlabel()这种基于状态的写法。前者逻辑更清晰尤其在绘制多子图时优势巨大。figsize参数控制图形宽高单位英寸dpi控制保存图片的清晰度。4.2 常用图表类型与pandas集成pandas的Series和DataFrame都有一个plot方法通过kind参数指定图表类型非常便捷。# 折线图 - 观察趋势 df[成绩].plot(kindline, title成绩趋势图) # 或 df.plot(x日期, y销售额, kindline) # 柱状图 - 比较类别 df.groupby(班级)[成绩].mean().plot(kindbar, colorskyblue, edgecolorblack) # 水平柱状图用 kindbarh # 直方图 - 查看分布 df[年龄].plot(kindhist, bins10, alpha0.7, rwidth0.85) # 箱线图 - 查看分布、识别异常值 df[[语文,数学,英语]].plot(kindbox) # 散点图 - 查看两个变量的关系 df.plot(kindscatter, x学习时长, y成绩) # 饼图 - 显示占比谨慎使用尤其类别多时 df[班级].value_counts().plot(kindpie, autopct%1.1f%%)注意事项折线图的X轴数据最好是连续或有序的如时间。柱状图的柱子之间通常有间隙直方图的柱子是紧挨着的用于表示连续数据的分布。箱线图的“箱子”展示了数据的四分位距IQR胡须通常延伸到1.5倍IQR范围内的最远数据点之外的点被视为异常值点。饼图在数据可视化界争议较大当类别超过5个或数值接近时很难比较。考虑用柱状图或环形图替代。pandas绘图后仍然可以用plt.xlabel、plt.title等matplotlib函数进行细节调整它们是相通的。4.3 多子图绘制与图形美化绘制多子图是报告中的常客。fig, axes plt.subplots(nrows2, ncols2, figsize(12, 10)) # 2x2的子图网格 axes axes.flatten() # 将2x2的axes数组展平为1维方便循环 # 在第一个子图绘图 axes[0].plot(x1, y1) axes[0].set_title(子图1) # 在第二个子图绘图 axes[1].bar(categories, values) axes[1].set_title(子图2) # ... 以此类推 plt.tight_layout() # 关键自动调整子图间距防止标签重叠 plt.show()图形美化默认的图表样式比较朴素。可以通过设置颜色、线型、标记、添加文本注释等来美化。颜色可以使用颜色名称red、十六进制码#FF5733、RGB元组(0.1, 0.2, 0.5)。线型和标记linestyle-,--,:,-.markero,s,^,D。添加文本ax.text(x, y, 文本内容)用于在特定坐标添加注释。添加箭头注释ax.annotate(注释文本, xy(目标点坐标), xytext(文本起始坐标), arrowpropsdict(arrowstyle-))。这是考试和实际应用中很实用的功能用于高亮图表中的特定点。关于twinx当需要在一个图中显示两个量纲不同的Y轴时使用。网络热词中提到的“matplotlib twinx出现两张图”问题通常是因为没有正确地将第二个Y轴的数据绘制在对应的Axes上。fig, ax1 plt.subplots() ax1.plot(x, y1, g-) ax1.set_ylabel(Y1轴, colorg) ax2 ax1.twinx() # 创建共享X轴的新Y轴 ax2.plot(x, y2, b--) ax2.set_ylabel(Y2轴, colorb) # 这样两条线就会出现在同一个图里而不是两个独立的图5. 环境配置、常见错误与实战技巧5.1 Python环境与包管理对于数据分析我首推Anaconda发行版。它集成了Python、Numpy、pandas、matplotlib等几乎所有你需要的科学计算包还有强大的conda包和环境管理器。安装与配置从官网下载Anaconda安装包一路下一步即可。在开始菜单打开Anaconda PromptWindows或终端Mac/Linux。创建一个独立的虚拟环境是个好习惯conda create -n data_analysis python3.9激活环境conda activate data_analysis安装包conda install numpy pandas matplotlib jupyter或pip install numpy pandas matplotlib关于离线安装如果电脑无法联网需要离线安装pandas等包如热词中提到的“anaconda如何离线安装pandas”。你需要在一台有网的电脑上用pip download pandas -d ./packages下载包及其所有依赖的.whl或.tar.gz文件然后拷贝到离线电脑用pip install --no-index --find-links./packages pandas安装。VSCode配置在VSCode中确保左下角选择了正确的Python解释器你创建的data_analysis环境。安装Python扩展后就能获得代码提示、调试等功能体验很好。5.2 高频错误排查与解决这里汇总了大家最容易遇到的几个错误ModuleNotFoundError: No module named numpy原因没有安装numpy或者在错误的Python环境中运行。解决在终端用pip list检查当前环境已安装的包。确保在正确的环境中用pip install numpy安装。RuntimeError: Numpy was built with baseline optimizations:原因这是一个警告而非错误通常出现在较旧的CPU上。它提示你的Numpy使用了较新的指令集编译而你的CPU不支持。解决可以忽略程序通常能正常运行。如果追求性能可以尝试用conda install numpy重装conda的版本可能针对更广泛的CPU优化或者从源码编译。Process finished with exit code -1066598273 (0xc06d007f)原因这是一个Windows上的通用崩溃代码通常与内存访问冲突、软件冲突或matplotlib后端问题有关。解决尝试在代码开头强制指定matplotlib使用非交互式后端import matplotlib; matplotlib.use(Agg)。更新matplotlib到最新版本。检查是否有其他软件冲突如某些杀毒软件。KeyError或IndexError原因用.loc或[]索引时使用了不存在的标签或位置。解决打印df.columns和df.index确认标签使用df.shape确认位置范围。使用df.get(列名, default_value)可以避免KeyError。SettingWithCopyWarning原因这是一个警告提示你对一个可能是切片副本的DataFrame进行赋值操作原始数据可能不会被修改。解决这是pandas最著名的坑之一。确保你的赋值操作对象是明确的。如果明确想修改原始数据的一个子集使用.loc索引df.loc[mask, 列名] new_value。如果只是想处理副本可以显式复制df_subset df[mask].copy()。5.3 期末实战与复习策略最后结合一个微型实战案例串联一下核心流程并给出复习建议。案例分析学生成绩表假设有students.csv包含姓名、班级、语文、数学、英语、总分列。import pandas as pd import matplotlib.pyplot as plt # 1. 加载与探索 df pd.read_csv(students.csv) print(df.info()) print(df.describe()) # 2. 数据清洗 # 检查缺失值 print(df.isnull().sum()) # 假设用平均分填充缺失的单一科目成绩 df.fillna(df.mean(numeric_onlyTrue), inplaceTrue) # 3. 数据分析 # 计算各科平均分 subject_avg df[[语文,数学,英语]].mean() # 按班级统计平均总分 class_avg_total df.groupby(班级)[总分].mean().sort_values(ascendingFalse) # 找出数学最高分的学生 top_math_student df.loc[df[数学].idxmax(), 姓名] # 4. 数据可视化 fig, axes plt.subplots(1, 2, figsize(14, 5)) # 子图1各科平均分柱状图 subject_avg.plot(kindbar, axaxes[0], color[red,green,blue]) axes[0].set_title(各科目平均分对比) axes[0].set_ylabel(平均分) # 子图2班级平均总分柱状图 class_avg_total.plot(kindbarh, axaxes[1], colororange) # 水平柱状图更直观 axes[1].set_title(各班级平均总分排名) axes[1].set_xlabel(平均总分) plt.tight_layout() plt.savefig(成绩分析.png, dpi150) plt.show() # 5. 输出结论 print(f全校数学最高分获得者是{top_math_student}) print(各班级平均总分排名) print(class_avg_total)期末复习策略理解优先于记忆不要死记硬背每个函数的参数。理解Numpy的数组思想、pandas的表结构思想、matplotlib的图形对象层次。动手敲代码只看不练永远学不会。把课件或书上的例子自己敲一遍然后尝试修改参数观察输出变化。梳理流程按照“数据加载 - 查看探索 - 清洗处理 - 转换整理 - 分组聚合 - 可视化 - 结论”这个流程把每个环节常用的函数和方法串起来。重点突破针对自己的薄弱环节比如总是搞混.loc和.iloc或者对groupby理解不深找相关题目集中练习。善用官方文档和搜索考试时如果忘记某个参数记住核心函数名靠逻辑也能猜个八九不离十。平时多查pandas官方文档它是最好的参考书。复习时把这份归纳当作地图哪里不熟点哪里。把核心的代码片段如数据读取、索引过滤、分组聚合、绘图框架自己整理成一个“速查笔记”考前快速过一遍效果会非常好。数据分析是一门实践学科这些工具用的多了自然就熟了。祝大家期末都能取得好成绩