资讯动态

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

发布时间:2026/9/9 19:21:59 来源:尧图企业网站定制
简介这份压缩包是北京邮电大学 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, encodinggbk)如果报错就换成gb18030或者utf-8轮流试再不行用二进制方式打开文件看一眼前几行内容判断到底是什么编码with open(data/成绩表.csv, rb) as f: print(f.read(200))读取的时候还要留意几个参数文件是制表符分隔就加sep\t文件没有表头就加headerNone然后手动指定列名如果数据列里有千分位逗号可以加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], keepfirst)异常值则稍微复杂一些。先用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], errorscoerce) df_clean[score] pd.to_numeric(df_clean[score], errorscoerce) 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(kindbar, xclass_name, yavg_score) plt.title(各班平均分对比) plt.savefig(output/avg_score_bar.png, dpi150, bbox_inchestight)最后导出结果注意一个细节导出的csv如果不想让Excel打开时中文乱码编码不要用utf-8要用utf-8-sigresult.to_csv(output/result.csv, indexFalse, encodingutf-8-sig)到这里一份能交差的数据处理作业基本成型读进来、洗干净、算清楚、画成图、导出去。5. 大文件与流式处理思路以及高频报错速查表5.1 大数据不要硬扛分块与流式思想课程作业的文件一般不大但如果以后做真实项目几个GB的csv非常常见。那时候直接pd.read_csv一读内存直接爆掉电脑卡死半天白干。解决方案是“分块”或“流式”处理——不要一次性把所有数据搬进内存像流水线一样一块一块地读每块算一点结果最后汇总chunk_iter pd.read_csv(big_data.csv, chunksize100000) 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 pandasUnicodeDecodeError: utf-8 codec cant decode byte文件不是utf-8多半是gbk读取时加encodinggbk或encodinggb18030FileNotFoundError路径写错或当前工作目录不对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里和原始文件对照着看很多错误一眼就能发现。这样交上去的作业不管是给老师看还是自己回头翻心里都有底。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价