news 2026/9/9 19:21:57

Python数据处理实战:从csv清洗到可视化完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python数据处理实战:从csv清洗到可视化完整指南

简介:这份压缩包是北京邮电大学 Python 课程的数据处理作业集合,面向正在学习 Python 的大学生、数据科学新手以及需要实战练习的编程爱好者。作业设计覆盖 Python 语法基础、函数与模块、面向对象编程,并引入真实场景中的数据分析环节,能够帮助学习者完成从理论到实践的过渡。包内共计一百零三个文件,包含二十四个 Python 脚本、十六个 Jupyter 笔记、十二个 CSV 数据集、三十二张 PNG 图表,另有配置、文档等辅助材料,整体大小约八十四点四六兆字节。目前已有九十四人学习下载。资源细致拆分了学习笔记、复习巩固题与综合性大作业:笔记部分梳理变量、控制流、异常处理、类与对象等核心知识点;练习与作业则围绕天气和 PM2.5 数据,应用爬虫采集、数据清洗、预处理及可视化工具,完整展示数据项目流程;zgl_resource 子目录中的补充代码与教程链接,也为自学提供更多素材,适合作为课程设计或期末复习的资料。 收到一个名为“北邮python作业-数据处理.zip”的压缩包并不是什么稀奇事。每年到这个节点,总会有同学发来这种命名的文件,打开一看,无非是一份csv或excel格式的原始数据,加一个篇幅不长的需求文档,再配一句“帮我看看怎么处理”。这类作业在形式上虽然挂了学校名,但内核非常一致:用python完成从数据读取、清洗、统计到可视化的全流程。很多人觉得这就是个课程作业,糊弄过去就完了,但实际上,这套处理思路正是爬虫、数学建模、数据分析甚至AI项目里最常用到的基本功。这篇文章我不打算替你写作业,而是把一个典型数据处理项目的完整拆解过程写在这里——从解压zip开始,到环境配置、数据读取、清洗、聚合、可视化、导出,最后到高频报错与排查技巧,基本上你照着走一遍,不仅能交差,还能真的理解每一行代码在干什么。

1. 拿到“数据处理”作业后,先拆清楚要考什么

1.1 这类作业的隐藏纲目:从输入到输出是一条流水线

数据类作业无论描述写得多花哨,本质都是一条固定流水线:读数据、看数据、清洗、加工、统计、出结果、写报告。很多同学一上来就直接写groupby,结果发现数据里有空值和脏字符串,统计出来全是错的——问题就出在跳过了“摸底”这个步骤。

比较稳妥的做法是,拿到数据先df.head()、df.info()、df.describe()三连,把数据的列、类型、缺失情况、分布范围摸清楚,再开始后续处理。这就像做饭之前先看冰箱里有什么,而不是凭感觉开火。每一步都留好代码,之后换任何数据集都能套用。我当时带过的同学里,凡是规规矩矩按这条流水线走的,最后交上来的东西基本都能跑通;凡是跳过清洗直接统计的,十有八九在答辩时被问住了。

1.2 环境配置:三个命令解决90%的拦路虎

很多同学卡在第一步,不是不会写代码,而是pandas压根没装,或者装到了别的解释器里。python下载安装的时候记得勾选Add python to PATH,然后打开命令行,一次性把常用库装齐:

pip install pandas numpy matplotlib openpyxl

如果用VSCode写,建议在项目根目录创建虚拟环境,避免和系统全局环境互相污染:

python -m venv venv venv\Scripts\activate # Windows # source venv/bin/activate # macOS / Linux pip install pandas numpy matplotlib openpyxl

这种作业用Jupyter Notebook来做其实更顺手,因为可以一格一格地跑,错了就改当前格,不用每次从头执行。VSCode里直接新建.ipynb文件就能跑。至于具体用哪个编辑器,真的不重要,能跑就行。

场景手动Excel处理Python脚本处理
处理100个同样结构文件打开、复制、粘贴,重复到怀疑人生for循环遍历,几分钟全搞定
修改处理逻辑每一步操作很难还原,容易漏改改一行代码,重跑一遍即可
复杂匹配左顾右盼找VLOOKUP,速度感人pd.merge()一行解决
结果留痕操作步骤基本靠回忆脚本就是完整可追溯的记录

2. 数据读取:90%的作业事故都发生在这一步

2.1 先把zip解开:解压与路径问题的正确姿势

作业包既然是zip,第一步自然是解压。手动右键解压当然可以,但如果文件多、路径深,手动操作很容易把文件解压到错误目录,后面写代码时路径怎么都对不上。我习惯直接在代码里解压,顺便打印文件结构:

import zipfile from pathlib import Path zip_path = Path("北邮python作业-数据处理.zip") target_dir = Path("data") with zipfile.ZipFile(zip_path, "r") as zf: zf.extractall(target_dir) for p in target_dir.rglob("*"): print(p)

用pathlib处理路径,能避开在Windows上拼字符串导致的反斜杠转义问题。很多人明明文件就在data目录下,却报FileNotFoundError,十有八九是当前工作目录不对。可以先用os.getcwd()看一下当前目录,再用相对路径,而不是写死“C:\Users\xxx\Desktop\北邮python作业-数据处理.zip”这种一换电脑就废的绝对路径。

这里顺嘴提一句,如果作业是从GitHub仓库下载的zip压缩包,我建议直接用git clone而不是下载zip。zip里没有.git目录,后面想关联远程仓库、变基推代码,都会变得非常痛苦。作业包和代码库是两码事,别混着用。

2.2 编码与读取:UnicodeDecodeError是新手劝退器

python读csv最常见的“玄学”就是编码问题。明明文件就在那里,一读就报UnicodeDecodeError。原因很简单,Windows上的Excel另存为的csv,默认编码通常是gbk或gb18030,而pandas的默认读取编码是utf-8,两边对不上自然报错。

import pandas as pd # 最保险的一行: df = pd.read_csv("data/成绩表.csv", encoding="gbk")

如果报错,就换成gb18030或者utf-8,轮流试;再不行,用二进制方式打开文件看一眼前几行内容,判断到底是什么编码:

with open("data/成绩表.csv", "rb") as f: print(f.read(200))

读取的时候还要留意几个参数:文件是制表符分隔就加sep="\t";文件没有表头就加header=None,然后手动指定列名;如果数据列里有千分位逗号,可以加thousands=","。pandas的read_csv参数非常多,但一个作业里真正会用到的就那几个,别被文档劝退。

3. 数据清洗三板斧:缺失值、重复值、异常值

3.1 缺失值:先统计再决定,不要无脑drop或fill

数据清洗是这份作业最容易得分、也最容易翻车的地方。很多同学拿到含NaN的数据,第一反应就是df.dropna()一把梭,结果本来有1000条记录的数据,删完只剩200条,后面的统计结果自然偏得离谱。

正确的姿势是先看缺失的规模和位置:

print(df.isnull().sum())

然后根据情况处理:

# 核心字段缺失,直接删除对应行 df_clean = df.dropna(subset=["score"]) # 整列缺失比例太高,删列 df_clean = df_clean.drop(columns=["unused_col"]) # 数值型字段少量缺失,用均值或中位数填充 df_clean["score"] = df_clean["score"].fillna(df_clean["score"].median())

用生活化的话说,一摞登记表里有几张没填手机号。如果这张表除了手机号没别的价值,丢掉就丢掉了;如果只是其中一个字段没填,其他内容都有用,那要么找到本人补录,要么标记一下“缺失”,而不是把整张表扔了。填充用均值还是中位数,要看过不过分受极端值影响。分数这种往往有异常高分的输入错误,用中位数更稳健。

3.2 重复值与异常值:先查出来,再判断怎么处理

重复数据在真实数据集里太常见了。同一个id可能出现好几回,尤其是手工汇总出来的表格。去重时最好指定判断依据,别把原本合理的重复行误删:

df_clean = df_clean.drop_duplicates(subset=["student_id"], keep="first")

异常值则稍微复杂一些。先用describe()看min和max,再用箱线图辅助判断。这里给一个用IQR(四分位距)识别离群点的标准做法:

Q1 = df_clean["score"].quantile(0.25) Q3 = df_clean["score"].quantile(0.75) IQR = Q3 - Q1 low = Q1 - 1.5 * IQR high = Q3 + 1.5 * IQR outliers = df_clean[(df_clean["score"] < low) | (df_clean["score"] > high)] print(outliers)

但注意,识别出来不等于要删。如果这个人的分数是150分(总分100),那多半是录入错误,可以删除或修正;如果某个学生成绩0分,那可能是缺考,要结合业务场景决定。不要看到离群点就删,真实数据的边缘值有时候恰恰是最关键的信息。

3.3 类型转换:时间、字符串和数值之间的“翻译”

清洗完缺失和重复,还要处理“看起来对,实际不对”的字段类型。最常见的是把日期字符串转成时间类型、把数字字符串转成数值、把研究对象相关的分类字段转成category类型。

df_clean["birth_date"] = pd.to_datetime(df_clean["birth_date"], errors="coerce") df_clean["score"] = pd.to_numeric(df_clean["score"], errors="coerce") df_clean["class_name"] = df_clean["class_name"].astype("category")

一句话,pandas里的astype和pd.to_datetime就是“翻译官”,把格式不统一的原始内容翻译成适合计算和筛选的类型。这一步做完,数据清洗才算基本收工。

4. 数据加工、分组统计与可视化:让数据会说话

4.1 字段加工:一个模拟场景带你上手

清洗完数据,接下来就是“算东西”。我拿一个简化场景当例子:假设数据是一份学生选课记录,里面有课程名、学时、人数和成绩。要算总评,思路是先加一列综合分:

df_clean["final_score"] = ( df_clean["usual_score"] * 0.3 + df_clean["exam_score"] * 0.7 )

字符串处理也很常见。比如字段里混了空格和多余字符,先清干净再分组,否则“网络工程 ”和“网络工程”会被当成两个组:

df_clean["course_name"] = df_clean["course_name"].str.strip()

筛选是另一个高频操作。想看看某门课成绩大于85的有多少人:

high_scores = df_clean[ (df_clean["course_name"] == "数据结构") & (df_clean["final_score"] > 85) ] print(high_scores.shape[0])

4.2 分组统计:groupby的常见用法与坑

分组的终极目的,是从“每一行是一条记录”变成“每个组是一行结论”。比如按班级统计各科平均分、最高分、最低分和人数:

result = ( df_clean.groupby(["class_name", "course_name"]) .agg( avg_score=("final_score", "mean"), max_score=("final_score", "max"), min_score=("final_score", "min"), stu_count=("student_id", "count"), ) .reset_index() ) print(result)

groupby之后如果不加reset_index,结果里分组字段会被塞进索引里,后续画图或者筛选时很容易出现“明明有这列却访问不到”的诡异问题。遇到这种情况,先reset_index()再看df.columns,准能解决。

4.3 可视化与导出:中文乱码与保存图片

统计做完,作业通常要配图。matplotlib默认字体不支持中文,画出来的图全是方框,这一步能挡掉一大半人。开头加两行代码就好了:

import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"] plt.rcParams["axes.unicode_minus"] = False

画个各班平均分的柱状图:

result.plot(kind="bar", x="class_name", y="avg_score") plt.title("各班平均分对比") plt.savefig("output/avg_score_bar.png", dpi=150, bbox_inches="tight")

最后导出结果,注意一个细节:导出的csv如果不想让Excel打开时中文乱码,编码不要用utf-8,要用utf-8-sig:

result.to_csv("output/result.csv", index=False, encoding="utf-8-sig")

到这里,一份能交差的数据处理作业基本成型:读进来、洗干净、算清楚、画成图、导出去。

5. 大文件与流式处理思路,以及高频报错速查表

5.1 大数据不要硬扛:分块与流式思想

课程作业的文件一般不大,但如果以后做真实项目,几个GB的csv非常常见。那时候直接pd.read_csv一读,内存直接爆掉,电脑卡死,半天白干。

解决方案是“分块”或“流式”处理——不要一次性把所有数据搬进内存,像流水线一样一块一块地读,每块算一点结果,最后汇总:

chunk_iter = pd.read_csv("big_data.csv", chunksize=100000) total = 0 for chunk in chunk_iter: total += chunk["value"].sum() print(total)

还可以用usecols只读需要的列,用dtype把某些列指定成更节省内存的类型(比如把float64改成float32),用astype("category")压缩重复度高的字符串列。这个思路放到点云、GIS、高通量实验数据等场景里都一样适用,框架变了,底层逻辑不变。

5.2 高频报错与排查速查表

做一个数据处理作业,不报错是不可能的。我把这几年帮别人排查过的高频问题整理成了一个速查表,建议大家收藏,遇到问题直接对着查:

报错/现象最可能原因快速解法
ModuleNotFoundError: No module named 'pandas'库没装,或解释器选错检查VSCode右下角解释器;命令行执行pip install pandas
UnicodeDecodeError: 'utf-8' codec can't decode byte文件不是utf-8,多半是gbk读取时加encoding="gbk"或encoding="gb18030"
FileNotFoundError路径写错,或当前工作目录不对print(os.getcwd())查看目录;改用pathlib或相对路径
KeyError: 'xxx'列名写错,或文件没有表头先df.columns打印实际列名,再改代码
SettingWithCopyWarning链式赋值,操作的是副本用df.loc[...]修改,或先df = df.copy()
MemoryError数据量太大,内存不够分块读取,或用usecols只读需要的列
图里中文全是方框matplotlib默认字体不支持中文设置plt.rcParams["font.sans-serif"] = ["SimHei"]

5.3 两个能救命的小习惯

最后分享两个我自己被坑过之后才养成的习惯。

第一,拿到原始数据先复制一份备份,所有清洗操作都在副本上做。这能让你在把数据洗坏之后,一键回到原始状态,而不是重新去下载一遍文件。第二,处理过程中把每一步df.head()的输出截图或保存下来,写实验报告时直接贴图,既能证明每步操作的合理性,也能让老师看出你的思路是清晰的。多少报告写得像天书,就是缺了中间过程的截图。

另外,如果作业zip压缩包本身设了密码,那就别琢磨什么破解工具了,最稳妥的办法是直接找发文件的人要密码。课程资料类压缩包加密,一般只是为了防误改,联系老师或者课程群要一下就行。把时间花在正经的数据处理上,比折腾这些奇怪工具值多了。

说实话,每次看到这种“北邮python作业-数据处理.zip”,我都会想起自己第一次面对一堆乱数据时的狼狈。当时完全不懂先看数据概览、先处理缺失值,上来就急着算结果,最后算出来的均值和真实情况差了十万八千里。这个作业真正想让你练的,不是调库,而是面对一团乱麻时,敢不敢拆开、敢不敢下手去清理的勇气和条理。我的经验是,别追求一次写对,先写出能跑通的小步骤,跑通了再逐步优化。最后留一个小技巧:处理前先df.head(10).to_csv("preview.csv"),把样例输出拷到Excel里和原始文件对照着看,很多错误一眼就能发现。这样交上去的作业,不管是给老师看还是自己回头翻,心里都有底。

本文还有配套的精品资源,点击获取

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

基于OpenCV的车牌识别系统实战:从图像预处理到字符识别的完整流程

简介&#xff1a;基于OpenCV的车牌识别系统代码包&#xff0c;面向计算机视觉初学者与智能交通相关开发者&#xff0c;从样本到模型提供了完整的学习链路&#xff0c;可用于快速搭建从图像预处理、车牌定位、字符分割到OCR识别的完整流程。整个压缩包共23个文件&#xff0c;大小…

作者头像 李华
网站建设 2026/9/9 19:20:14

如何开启 MediaCrawler 的图片与视频下载爬取(ENABLE_GET_MEIDAS)?

如何开启 MediaCrawler 的图片与视频下载爬取&#xff08;ENABLE_GET_MEIDAS&#xff09;&#xff1f; 【免费下载链接】MediaCrawler 小红书笔记 | 评论爬虫、抖音视频 | 评论爬虫、快手视频 | 评论爬虫、B 站视频 &#xff5c; 评论爬虫、微博帖子 &#xff5c; 评论爬虫、百…

作者头像 李华
网站建设 2026/9/9 19:19:42

孤岛交直流微电网集群构网型变流器故障的不间断分层分布式控制复现

做交直流混合微电网集群的论文复现&#xff0c;最磨人的往往不是主电路拓扑本身&#xff0c;而是故障发生的那一瞬间&#xff0c;控制系统怎么在几百毫秒内把电压和频率的“接力棒”平稳交出去。我复现的这篇论文&#xff0c;主题就落在孤岛交直流微电网集群在构网型变流器故障…

作者头像 李华
网站建设 2026/9/9 19:15:39

串口通信从原理到实践:UART、RS232、TTL与Python联调指南

简介&#xff1a;串口通信是嵌入式开发、设备联调与自动化测试中最基础也最可靠的通信手段&#xff0c;广泛应用于单片机、工业控制及上位机交互等场景。理解UART、RS232、TTL的本质区别&#xff0c;掌握波特率、数据位、停止位等关键参数配置&#xff0c;是排除通信故障的第一…

作者头像 李华