
Data-Science-For-Beginners 表单数据评估实战用 Pandas 诊断与清洗客户表单采集数据【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners本篇文章围绕微软开源课程 Data-Science-For-Beginners 第 8 课配套练习「Evaluating Data from a Form评估表单数据」展开一位客户用一个小型 HTML 表单采集了客户基础信息交付你验证数据质量、定位可视化结果异常的原因并给出表单改进建议。读完本文你将掌握用 pandas 检查缺失值、统一格式、去重等清洗手段并能够把「数据入口设计」与「数据清洗」结合起来从源头提升采集数据的准确性与一致性。任务背景客户表单与待验证的数据表单结构客户部署的表单是一个极简静态页面 index.html浏览器直接打开即可查看。从源码看它只包含三个采集字段h1Please Fill out the Form (* required)/h1 *labelBirth Month/label input typetext br labelState/label input typetext br label forpetsDogs or Cats?/label select namepets idpets option valuedogsDog/option option valuecatsCats/option /select br buttonSubmit/button值得注意的三个细节**Birth Month出生月份**用自由文本框输入虽然标了*必填但没有任何格式约束**State州**同样是自由文本且未标记必填Dogs or Cats?是下拉框选项value为小写复数dogs/cats而页面显示文本为Dog/Cats值与标签的约定并不一致。这些「看起来无关紧要」的设计差异正是后续数据问题的源头也是本次评估任务的核心线索。待验证的数据集客户提供了表单记录的 form.csv 数据集10 行 3 列birth_month,state,pet January,,Cats JAN,CA,Cats Sept,Hawaii,Dog january,AK,Dog July,RI,Cats September,California,Cats April,CA,Dog January,California,Cats November,FL,Dog December,Florida,Cats肉眼扫一遍即可发现大量「脏数据」特征月份大小写混用January/JAN/january、缩写与全称混用SeptvsSeptember、州名缩写与全称混用CAvsCalifornia、FLvsFlorida、空值第一条记录的 state 为空等。练习要求与评估标准原练习文档要求如下原文来自 translations/fr/2-Working-With-Data/08-data-preparation/assignment.md英文原版见 assignment.mdInstructions任务要求运用本课Data Preparation讲授的技术就如何改进表单、使其能够采集到准确且一致的信息提出你的建议。练习配套的评估表格Rubric给出了三个维度Exemplary优秀Adequate合格Needs Improvement需改进完整识别出数据质量问题并逐一给出代码级修复方案同时能指出表单设计层面的根源并提出可落地的改进建议识别出大部分质量问题并给出部分处理建议仅指出少量问题或缺乏可操作的修复建议结合练习说明交付物应包含① 对数据集质量问题的诊断② 解释可视化为何「看起来不正确」③ 基于 pandas 的清洗/标准化方案④ 对表单本身的改进建议。第一步加载数据并探查练习提供的 assignment.ipynb 已经给出了加载数据与绘制可视化的骨架。核心代码为import pandas as pd import matplotlib.pyplot as plt # 加载数据集相对于仓库根目录的路径 path data/form.csv form_df pd.read_csv(path) print(form_df)运行后输出与 notebook 内记录的结果一致birth_month state pet 0 January NaN Cats 1 JAN CA Cats 2 Sept Hawaii Dog 3 january AK Dog 4 July RI Cats 5 September California Cats 6 April CA Dog 7 January California Cats 8 November FL Dog 9 December Florida Cats课程 README2-Working-With-Data/08-data-preparation/README.md中强调面对任何数据集第一步都是探查通过元信息快速建立对数据规模、结构与内容的整体认知再做进一步判断。常用手段包括form_df.shape # (10, 3)10 行 3 列 form_df.info() # 各列类型、非空计数与内存占用 form_df.head() # 前 5 行 form_df.tail() # 后 5 行 form_df.describe() # 数值列的统计摘要本例全为文本列作用有限对这份数据来说info()会立即暴露问题state列存在非空计数少于总行数的情况因为 CSV 中的空字段被 pandas 自动解析为NaN这正是「缺失值」的第一信号。第二步诊断数据质量问题的根源对照课程 README 归纳的常见清洗目标格式统一、重复值、缺失值、探索性观察本数据集存在的问题可逐项归类。月份字段大小写与缩写不一致birth_month里January出现了三次但写法分别是January、JAN、januarySept与September实为同一个月。也就是说同一月份在数据集中被拆成了多个互不相同的字符串。州字段缺失值 缩写/全称混用state列第一条记录为空NaN同时CA与California指向同一个州FL与Florida同理。若按原始字符串做统计同一个州会被拆成两个类别。宠物字段值与标签约定不一致pet列只出现Cats与Dog两种值但它们既不是表单value中的小写复数dogs/cats也不是统一的大小写/单复数约定——Cats是复数而Dog是单数。若不同批次的数据分别按「标签」和「值」落库后续合并必然产生新类别。可视化为什么「看起来不正确」练习中客户报告「部分可视化看起来不对」。原因并不在绘图本身而在数据value_counts()是按字符串精确相等分组的。课程 Notebook2-Working-With-Data/08-data-preparation/notebook.ipynb中的实践也印证了这一点——对脏的分类列直接做计数等价于把同一实体的不同拼写当成不同类别form_df[state].value_counts().plot(kindbar) plt.show() form_df[birth_month].value_counts().plot(kindbar) plt.show()于是birth_month的柱状图上会出现三个并排的January/JAN/january柱子state图上会出现两个并排的CA/California柱子——客户眼中「不对」的图根源是数据未标准化而不是代码有 bug。第三步用 Pandas 清洗表单数据以下操作全部对应课程 README 与 Notebook 中讲解的核心 API可直接在 assignment.ipynb 或独立 Python 环境中复现。3.1 检测缺失值isnull/notnull课程指出pandas 用NaNIEEE 浮点规范中的特殊值表示缺失浮点值用 Python 的None表示其余类型的缺失而isnull()/notnull()是检测两者的主要手段返回布尔掩码form_df.isnull() # 逐元素布尔掩码 form_df.isnull().sum() # 每列缺失数量state 列有 1 个 form_df.notnull() # 与 isnull 互补需要注意课程 Notebook 中的例子0是合法整数而非缺失空字符串在 pandas 看来同样是合法的字符串对象不是缺失值。本数据集中state的空单元格之所以被识别为NaN是因为read_csv在解析时就把空字段转成了缺失值。3.2 处理缺失值dropna/fillna课程提供了两种策略。一是删除用dropna()form_df.dropna() # 默认 howany删除含任一缺失值的行 form_df.dropna(axiscolumns) # 按列方向删除 form_df.dropna(howall) # 仅当整行全为缺失时才删除 form_df.dropna(thresh3) # 保留非空值数量 3 的行 form_df.dropna(subset[state]) # 仅依据指定列判断缺失二是填充用fillna()可以填固定值、前向填充或后向填充form_df.fillna(Unknown) # 用固定值填充 form_df.fillna(methodffill) # 前向填充用上一个有效值填补 form_df.fillna(methodbfill) # 后向填充用下一个有效值填补兼容性提示课程材料沿用fillna(methodffill)的写法在较新版本的 pandas 中该方法已被弃用推荐改用等价的df.ffill()与df.bfill()。3.3 标准化分类值映射字典 字符串方法针对大小写与缩写混用课程 Notebook 给出的做法是「先统一字符串形式再用映射字典标准化」——这也是本练习最核心的修复步骤。以下代码针对birth_month、state、pet三列分别处理# 月份统一为「首字母大写的完整月份名」 month_mapping { jan: January, feb: February, mar: March, apr: April, may: May, jun: June, jul: July, aug: August, sep: September, oct: October, nov: November, dec: December, } def normalize_month(v): if pd.isnull(v): return v s str(v).strip().title() # JAN - Jansept - Sept return month_mapping.get(s[:3].lower(), s) form_df[birth_month_clean] form_df[birth_month].apply(normalize_month) # 州缩写与全称统一为两字母大写缩写示例节选可按需补全 50 州 state_mapping { alaska: AK, california: CA, florida: FL, hawaii: HI, rhode island: RI, } def normalize_state(v): if pd.isnull(v): return v s str(v).strip().lower() if len(s) 2: # 已是缩写统一大写 return s.upper() return state_mapping.get(s, v) form_df[state_clean] form_df[state].apply(normalize_state) # 宠物统一为小写复数与表单 select 的 value 约定保持一致 def normalize_pet(v): if pd.isnull(v): return v s str(v).strip().lower() return {dog: dogs, cat: cats}.get(s, s) form_df[pet_clean] form_df[pet].apply(normalize_pet)标准化之后再统计柱子数量才会与真实类别数一致form_df[birth_month_clean].value_counts() # January 现在只有一根柱子 form_df[state_clean].value_counts() # CA 与 California 合并为一类对于更复杂的拼写差异课程 Notebook 还演示了用rapidfuzz库做模糊匹配相似度高于 70% 即提示为近义名称适合拼写变体多、难以穷举映射表的场景可参考 notebook.ipynb 中的「Detecting Inconsistent Categorical Values」一节。3.4 检测与删除重复值duplicated/drop_duplicates课程指出重复数据会扭曲统计结果、产生不准确的分析通常应删除但在多数据集合并时部分「重复」行可能携带补充信息需具体判断。检测与删除接口如下form_df.duplicated() # 布尔掩码标记与更早行重复的行 form_df.duplicated().sum() # 完全重复的行数 form_df.drop_duplicates() # 删除完全重复行 form_df.drop_duplicates(subset[pet]) # 仅依据指定列判断重复本数据集中虽然没有完全相同的行但存在近重复行第 0 行January缺州Cats与第 7 行JanuaryCaliforniaCats在月份与宠物上完全一致仅州字段一缺一全——这正是课程 Notebook「Detecting Near-Duplicate Rows」一节针对的场景。可以先做 3.3 的标准化再按关键列检测近重复form_df[form_df.duplicated(subset[birth_month_clean, pet_clean], keepFalse)]对这类近重复行建议与客户确认是否同一用户重复提交再决定去重或保留。3.5 参考完整的清洗流水线课程 Notebook 在末尾提供了一个可直接复用的「脏数据 → 干净数据」流水线示例创建示例脏数据集后依次执行三步1. 检测不一致的分类值并标准化映射字典 / 模糊匹配2. 检测异常数值离群点3. 检测近重复行。本练习的数据集为纯分类字段暂不涉及数值离群点但若后续表单增加年龄、金额等数值字段可直接套用该流水线的离群点检测逻辑详见 notebook.ipynb 末尾的「Creating a Sample Dirty Dataset」一节。第四步从源头改进表单设计课程 README 强调清洗的最终目标不仅是修好一份数据更是保证「易用与复用、跨数据集的一致性、模型准确性」。因此本练习的落点应是建议客户改进表单本身从源头避免脏数据。结合 index.html 的现状可给出如下可落地建议Birth Month将自由文本框替换为 12 个固定月份的select下拉框或用日期选择器彻底消除大小写与缩写差异required属性保持必填语义。State替换为包含 50 个两字母州缩写CA、FL等的下拉框禁止自由文本从机制上杜绝「缩写 vs 全称」混用。Pets统一value与显示标签的约定例如valuedogs配标签Dogs并保证入库值使用value而非显示文本避免单复数/大小写漂移。校验兜底为文本类字段补充 HTML5required、pattern、maxlength等约束后端入库前再做一次字符串strip()、title()/upper()归一化作为第二道防线。口径文档化在表单页或数据字典中明确每个字段的取值标准方便后续团队跨数据集合并时保持一致性对应课程强调的「Consistency」目标。评分建议与自查清单优秀Exemplary能同时给出 ① 数据质量诊断缺失、格式、重复、近重复② 可视化异常的解释value_counts按精确字符串分组③ 可运行的 pandas 清洗代码④ 指向表单源码的具体改进建议。合格Adequate识别出大部分问题并给出代码或表单层面的处理建议。需改进Needs Improvement仅罗列现象、缺乏根因分析与可操作方案。延伸学习课程主文档2-Working-With-Data/08-data-preparation/README.md清洗的意义、缺失值/重复值处理的完整讲解配套 Notebook2-Working-With-Data/08-data-preparation/notebook.ipynb含脏数据流水线示例与课后练习数据探查与后续分析4-Data-Science-Lifecycle/15-analyzing/README.mdpandas 基础DataFrame 概览2-Working-With-Data/07-python/README.md练习文件assignment.ipynb、表单页、数据集【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考