简介:这是一份面向北京邮电大学《Python程序设计》课程的数据处理作业合集,目标读者是正在学习Python数据分析、爬虫与可视化的在校生及自学者。压缩包共103个文件,体积84.46MB,以Python脚本(.py)、Jupyter Notebook(.ipynb)、CSV数据集(.csv)和PNG图表为核心,另有Scrapy配置文件、JSON、PDF说明等,覆盖从语法基础到工程实践的完整链路。内容分为“Python学习笔记”“复习巩固”“大作业”与“zgl_resource”四大模块:笔记部分总结变量、控制流、函数、异常处理及面向对象;练习题涉及列表、字典、字符串、正则与文件操作;大作业则基于北京、上海、广州、成都、沈阳等城市PM2.5历史和天气数据,要求完成数据清洗、探索性分析与可视化展示,并配有爬虫配置与参考代码。已有94人学习,对想快速积累真实数据处理经验、完成课程作业或准备相关面试的读者,这套资源能提供从笔记到项目的直接参照。 只要是国内理工科院校,大一、大二基本都逃不过一门叫“Python程序设计”的课。而它的期末,往往就是交一个压缩包,名字通常长这样:北邮python作业-数据处理.zip。收到这个包的人分两类:一类是这门课的学生,正对着里面一堆csv、txt、json发愁;另一类是帮学生看代码的助教或老学长,看到结构混乱、变量命名为a1、a2的代码就头疼。这篇博文就是写给前者看的——我拆过不少这种作业包,也帮人从零修到满分,今天干脆把整个流程捋一遍:从解压zip开始,到环境配置、数据处理思路、代码实现,再到提交前要做好的检查,全流程走下来,你就会发现这类作业其实就那几板斧。
1. 拿到压缩包之后,先把作业拆明白
1.1 这类作业包的常见结构与隐藏要求
先说结构。北邮风格的数据处理作业,zip包解开之后一般长这样:
作业包学号姓名/ ├── data/ │ ├── train.csv │ ├── test.csv │ └── 说明.txt ├── main.py └── 实验报告.docxdata目录里放原始数据,main.py是你的代码,实验报告说明你的思路和结论。看起来挺清晰,但真到写代码时,很多人直接就懵了:数据长什么样不知道、要求输出什么格式不知道、老师给的是十年前的接口示例代码跟自己本机Python版本还对不上。所以在敲第一行代码之前,我强烈建议你把data目录里的每个文件都用文本编辑器打开看一眼,再把说明.txt一字不差读一遍,这比看十遍课程PPT都有用。
看数据的时候,重点看三件事:文件编码、列名、数据量。编码决定了你read_csv时是写utf-8还是gbk,列名决定了后面筛选用哪个字段,数据量决定了你需不需要考虑性能。很多同学作业跑到一半报错,回头一看,就是“哦,原来这列叫score不叫grade”。
1.2 为什么我建议先写思路再写代码
你可能觉得这话是废话,但真不是。数据处理作业和算法作业不一样,它的核心不是“写出来”,而是“写对”。所谓写对,指的是你在处理每一步时都清楚数据变成了什么样。
我见过最典型的情况是:一上来就写df.dropna(),扔了一大堆数据,然后统计结果好看得不行,实际上把有效样本几乎删光了。这就是典型的没想清楚就动手。我自己处理这类作业的习惯是,先在纸上或者注释里列流程:
1. 读入数据,查看列名与缺失值 2. 统一日期格式,处理异常值 3. 按班级分组,计算平均分与及格率 4. 输出结果到result.csv,并画一张成绩分布图只花五分钟,但后面每写一段代码都会很踏实。这个习惯,比任何技巧都管用。
2. 磨刀不误砍柴工:环境、依赖与解压
2.1 Python与IDE选型:别在版本上踩坑
先说版本问题。这类作业交上来之后,老师那边跑代码用的环境通常很迷,有的还在Python 3.8,有的直接3.12。所以你在自己机器上写作业,建议安装Python 3.10或3.11,这是兼容性最稳的版本区间。3.12也问题不大,但如果遇到某些库还没有适配,会平白多出很多折腾。
IDE我推荐PyCharm或者VSCode二选一。Pycharm社区版免费,对学生党友好,项目结构一目了然,适合当主力;VSCode轻量、插件生态好,但环境配置需要自己折腾,适合想顺手学一下Python环境原理的人。无论选哪个,建好项目之后第一件事就是创建虚拟环境,别直接把包装到全局。虚拟环境的好处是:这个作业装什么库都不会污染其他项目,交作业的时候依赖清单也清晰。你只需要在项目根目录下执行:
python -m venv venv然后在PyCharm里把解释器指到venv,或者在VSCode里Ctrl+Shift+P选Python解释器,问题就解决了。
2.2 三个库装好,数据处理就赢了一半
数据处理作业,最核心的库就三个:pandas、numpy、matplotlib。pandas负责表格数据的读取、筛选、分组、统计,numpy负责数值计算和数组操作,matplotlib负责画图。只要作业没有特殊要求,这三个库能覆盖八成以上的需求。
安装很简单,在虚拟环境激活状态下执行:
pip install pandas numpy matplotlib如果你机器上有多个Python版本,记得用python -m pip而不是裸pip,否则很容易装到别的版本里去。装完之后快速验证一下:
import pandas as pd import numpy as np import matplotlib.pyplot as plt print(pd.__version__)能正常打印版本号,说明环境这一关过了。别小看这一步,每年作业季都有不少同学在“import pandas就报错”这个坎上卡了一晚上。
2.3 解压zip的几种姿势
回到标题本身的zip。这个压缩包能不能顺利解开,其实也影响心情。Windows下右键解压最简单,但如果你遇到解压出来的文件名乱码、或者解压到一半报“文件损坏”,就要换方法了。
我推荐学一下Python自带的zipfile模块,因为这是纯标准库,不需要装任何东西,还能顺带在作业里秀一下。比如这个示例:
import zipfile with zipfile.ZipFile("北邮python作业-数据处理.zip", "r") as zf: zf.extractall("作业目录")这段代码能解决90%的解压需求。绿地剩下的10%是中文文件名乱码,常见于Windows打包、macOS或Linux下解压的情况,原因是zip格式里文件名的编码没统一。遇到这种情况,可以拿到文件名后做一次编码修正:
import zipfile with zipfile.ZipFile("作业.zip", "r") as zf: for info in zf.infolist(): # 处理部分压缩包中文文件名乱码 info.filename = info.filename.encode("cp437").decode("gbk", errors="ignore") zf.extract(info, "解压后")这里不是玄学,而是因为部分Windows压缩工具默认用GBK写入文件名,但zipfile默认按UTF-8解码,于是出现了乱码。这类问题在作业互助群里被问过无数次,建议直接收藏这段代码。
3. 核心环节实操:读数据、洗数据、出结果
3.1 读数据与类型转换:先把数据变成能算的样子
数据处理的第一步永远是读数据。以最常用的CSV为例:
import pandas as pd df = pd.read_csv("data/train.csv", encoding="utf-8") print(df.head()) print(df.info())如果读的时候报编码错,把encoding换成gbk或者gb18030再试,多半能解决。读进来之后,df.info()会告诉你每一列的数据类型和非空数量,这是判断数据质量的第一手信息。
接下来是类型转换。这一步是作业里最容易出分也最容易丢分的地方。举个例子,成绩列读进来是字符串“85.5”,你想算平均分,就必须先转成float:
df["score"] = pd.to_numeric(df["score"], errors="coerce")errors="coerce"的意思是:能转的就转,不能转的变成NaN。这样再配合dropna(),就能把脏数据清掉,而不会因为一个格式错误的数据让整行崩溃。pandas里还有一种常见需求是字符串转时间,比如把“2024/06/01”这种文本统一成datetime类型:
df["date"] = pd.to_datetime(df["date"], format="%Y/%m/%d")类型转换的本质,是让数据在“你想要的计算方式”下是合法的。很多人算出的结果不对,往往不是公式错,而是数据类型从头到尾就错了,计算过程里全被当成字符串做了拼接。
3.2 筛选与统计:一个完整的Pandas演练
筛选和统计,是整个数据处理作业的重头戏。往年作业里经常要求“筛选出成绩在60到90分之间的学生,然后按班级统计平均分、最高分、最低分和人数”。用pandas做这件事,几分钟就搞定:
# 筛选成绩在指定区间的行 filtered = df[(df["score"] >= 60) & (df["score"] <= 90)] # 按班级分组,聚合多个指标 result = filtered.groupby("class")["score"].agg(["mean", "max", "min", "count"]) print(result) result.to_csv("result.csv", encoding="utf-8-sig")注意看,筛选条件里用了&而不是and,这是pandas的坑,因为这里的df["score"] >= 60本身是一个布尔型Series,多个条件就得用位运算符。另外,groupby之后一定要想清楚聚合函数是什么,count和size的区别要分清楚,前者不计NaN,后者计,别在这种细节上丢分。
如果作业要求画图,加上matplotlib即可:
import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ["SimHei"] # 防止中文乱码 result["mean"].plot(kind="bar") plt.title("各班级平均分对比") plt.savefig("class_mean.png", dpi=150)3.3 隐藏考点与好习惯
这种作业最容易被忽略的隐藏考点,其实是结果的“可复现性”。老师拿到你的代码,他会跑一遍,如果你代码里用了绝对路径,比如C:\Users\张三\Desktop\作业\data.csv,那换到老师的电脑上必挂。正确做法是相对路径,或者基于脚本所在目录动态拼接:
from pathlib import Path base = Path(__file__).parent df = pd.read_csv(base / "data" / "train.csv", encoding="utf-8")还有几个好习惯我也建议直接养成:用df.copy()复制数据再操作,避免链式修改触发SettingWithCopyWarning;处理完数据后保留一个处理前和处理后的对比表,实验报告里能直接用;所有中间结果命名清晰,比如clean_data.csv、result_summary.csv,而不是new1.csv、new2.csv。
4. 常见问题与排查技巧实录
4.1 运行报错速查表
平时被问得最多的报错,我整理成一个速查表,直接对照着排查比百度靠谱得多:
| 报错信息 | 常见原因 | 解决办法 |
|---|---|---|
| ModuleNotFoundError: No module named 'pandas' | 依赖没装上 | 在正确环境里执行pip install pandas |
| UnicodeDecodeError: 'utf-8' codec can't decode | 文件编码不是UTF-8 | 改成encoding=“gbk”或“gb18030” |
| SettingWithCopyWarning | DataFrame链式赋值 | 用.loc或者先.copy()一份 |
| TypeError: unsupported operand type(s) | 数据类型不对 | 用pd.to_numeric或astype转换 |
| FileNotFoundError: [Errno 2] | 路径写错 | 用相对路径或基于脚本目录拼接路径 |
| BadZipFile: File is not a zip file | zip包本身损坏 | 重新下载,或用7-Zip强制打开验证 |
4.2 文件读取不出来,通常栽在这三个地方
第一个是路径。你是不是把data.csv和main.py放在同一目录,然后写read_csv("data.csv")却报找不到?去确认一下当前工作目录是不是脚本所在目录。PyCharm里默认工作目录是项目根目录,而不是脚本所在目录,这个细节坑过无数人。解决方法就是上面说的用Path(file).parent来做基准路径。
第二个是编码。Excel保存的CSV通常是GBK编码,而Python3默认用UTF-8读,所以一读就炸。处理办法很简单:在read_csv里指定encoding参数,或者干脆重新存成UTF-8。记住一个原则:你写文件的时候,如果用to_csv,建议加utf-8-sig编码,这样用Excel打开才不会乱码。
第三个是分隔符。CSV不一定都是英文逗号分割,有些数据用制表符、分号,甚至中文逗号。遇到read_csv读出来只有一列,就去看看原始文件的分隔符是什么,然后用sep参数指定。
4.3 zip包本身出问题怎么办
还有一个很常见的情况是:作业包传到微信里再下载,zip包损坏了。Windows解压时提示“压缩包已损坏或压缩格式未知”,或者Python里报BadZipFile: File is not a zip file、could not find EOCD这类错误,基本就是文件结构不完整,最常见的原因是传输过程中被截断。
遇到这种问题,我的建议是不要急着去找什么修复工具强行修复,一是大概率修不回来,二是网上这类工具鱼龙混杂,很容易装一堆捆绑软件。正确做法是让发送方重新打包再传一次,或者用传输软件的“原文件发送”功能避免二次压缩。如果是自己打包发给老师,也记得用zip格式而不是rar,毕竟不是所有老师的电脑都装了WinRAR。
5. 提交前的收尾和几个私人习惯
5.1 最后5分钟的自测清单
很多同学写代码一时爽,交作业时候才发现少文件、路径跑不通,这些都是完全可以提前规避的。我自己在提交任何作业前都会按这份清单过一遍:
- 删除__pycache__目录、.idea目录和venv目录,这些不该出现在压缩包里
- 用python main.py重新跑一遍,确认程序能从头跑到尾
- 检查result.csv和输出的图片是否成功生成且内容符合预期
- 所有数据文件路径改成相对路径,并且测试在不同目录下都能运行
- 压缩包命名按照要求改好,通常是“姓名-学号-Python作业.zip”,不要叫“新建文件夹.zip”
- 压缩成zip格式,而不是7z或rar
看起来琐碎,但每年帮人看作业,一半以上的问题都出在自测不充分。你最不想发生的情况,是代码本身没毛病,结果因为文件组织乱被扣了分。
5.2 关于“用AI做作业”我的真实看法
最后说点实在话。现在AI写代码确实很强,我也用,但它对你最大的价值不是帮你直接交作业,而是当你的助教。你写完一段代码,让它帮你读一遍,问一句“有没有潜在问题”,它能帮你在提交前发现不少低级错误。但如果你直接复制一段AI代码交上去,遇到老师问“你这条groupby逻辑为什么这么写”时基本答不上来,这是最尴尬的。
换一个角度看,这类数据处理作业真正锻炼的,其实是“清理数据、结构化思考、验证结果”这一整条链路。以后你进实验室、做课程设计、甚至去实习,不管用什么语言,这套思路都是通用的。所以哪怕代码看起来很基础,也值得亲手把它完完整整跑通一遍。这个项目后续如果想继续扩展,可以试着把同样的流程换成真实比赛数据集,加一点特征工程和可视化分析,放到简历上就是一段完整的项目经历。
根据我自己帮人改作业的经验,最后补充一句:能在说明文档里把每一步为什么这么做写得清清楚楚的同学,往往比代码写得华丽但文档只写三行的,更容易拿高分。数据处理的本质是讲清楚数据的故事,你的代码和报告,就是你的讲述方式。
本文还有配套的精品资源,点击获取