十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Day 12 · AI 数据清洗:脏数据一键变干净

Day 12 · AI 数据清洗:脏数据一键变干净 「AI Python 系列」第 03 栏 · Python 爬虫实战全栏 15 篇 · 零成本跟完 作者梅雅达编程笔记首发CSDN摘要爬虫抓回来的数据到底有多脏格式不统一、分类混乱、有错别字、字段缺失——手动清洗能把你逼疯。传统方法靠正则和pandas一条条处理写规则的时间比爬数据还长。Day 12教你用AI做数据清洗让大模型帮你标准化字段、自动分类、修正错误、补全缺失。一篇真实的脏数据清洗全流程从乱糟糟到整整齐齐。数据抓下来了接下来面对的现实是——脏得没法直接用。一、爬虫数据到底有多脏从真实网站抓回来的数据典型问题问题例子格式不统一“北京”、“北京市”、“bj”、“beijing” 混着来分类混乱“Python开发”、“python工程师”、“后端-Python” 其实是一个岗位错别字“腾迅”、“阿里巳”OCR 识别错误或者人工输入错误字段缺失有些记录没薪资有些没公司名编码问题乱码、多余空白、换行符混入异常值薪资写成 “100k-200k”明显不合理手动一条条改几百条数据就让你怀疑人生。二、传统清洗 vs AI 清洗传统做法importpandasaspdimportre dfpd.read_csv(raw_jobs.csv)# 1. 统一城市名city_map{bj:北京,beijing:北京,上海市:上海,深圳市:深圳}df[city]df[city].str.strip().str.lower().map(city_map).fillna(df[city])# 2. 去掉多余空白df[title]df[title].str.strip()df[company]df[company].str.strip()# 3. 处理薪资格式defclean_salary(salary):ifpd.isna(salary):returnNone# 把 25k-50k·15薪 提取出 25 和 50matchre.search(r(\d)k?[\-\~](\d)k?,str(salary),re.I)ifmatch:returnint(match.group(1)),int(match.group(2))returnNonedf[[salary_min,salary_max]]df[salary].apply(lambdax:pd.Series(clean_salary(x)))# 4. 去重dfdf.drop_duplicates(subset[title,company])# 5. 删除缺失值dfdf.dropna(subset[title,company])看着不复杂那是因为这只是 5 个字段。如果数据有 20 个字段每个字段都有各自的清洗规则……写规则比抓数据还累。AI 做法promptf请清洗以下职位数据做以下处理 1. 统一城市名如 bj → 北京上海市 → 上海 2. 统一职位名称如 python工程师 → Python开发工程师 3. 修正公司名错别字 4. 薪资统一为数字单位千元如 25k-50k → min25, max50 5. 标记明显异常的数据如薪资100k以上 返回 JSON 数组。 原始数据{json.dumps(raw_data,ensure_asciiFalse)}一段prompt全部清洗规则都搞定。三、实战一份脏数据的全流程清洗脏数据样本raw_data[{title: Python开发 ,company:腾迅,city:shenzhen,salary:25k-50k},{title:python工程师,company:阿里巳,city:杭州市,salary:30k-60k·15薪},{title:后端-Python,company:字节的跳动,city:bj,salary:20k-40k},{title: Python ,company:美团点评,city:北京,salary:面议},{title:python dev,company:网异,city:beijing,salary:100k-200k},{title:,company:某公司,city:上海,salary:15k-25k},{title:爬虫工程师,company:,city:深圳,salary:18k-35k},]问题一目了然多余空格、错别字腾迅→腾讯、阿里巳→阿里巴巴、城市格式不统一、异常薪资、空字段。AI 清洗代码 Day 12 示例代码AI 数据清洗 作者梅雅达编程笔记 importjsonfromopenaiimportOpenAI clientOpenAI(api_keyYOUR_API_KEY,base_urlhttps://open.bigmodel.cn/api/paas/v4/)MODELglm-4-flashdefclean_data_with_ai(raw_data):用 AI 清洗脏数据promptf你是一个数据清洗专家。请清洗以下职位数据执行以下操作 1. **去空值**如果 title 或 company 为空/null/纯空格直接删除该条记录 2. **标准化城市**统一为简短中文名如 bj→北京、shenzhen→深圳、杭州市→杭州 3. **修正公司名**修正明显的错别字如 腾迅→腾讯、阿里巳→阿里巴巴 4. **标准化职位名**相似的职位统一名称如 python工程师、Python开发、后端-Python、python dev 统一为 Python开发工程师 5. **处理薪资** - 25k-50k → salary_min25, salary_max50 - 30k-60k·15薪 → salary_min30, salary_max60, pay_months15 - 面议 → salary_minnull, salary_maxnull - 标记明显不合理的薪资如 min 100 6. **去空格**所有字符串字段 trim 首尾空格 返回清洗后的 JSON 数组每条记录额外加一个 clean_status 字段 - ok正常 - corrected有修正在 corrections 字段说明改了什么 - abnormal有异常值 只返回 JSON。 原始数据{json.dumps(raw_data,ensure_asciiFalse,indent2)}responseclient.chat.completions.create(modelMODEL,messages[{role:user,content:prompt}],temperature0.1)contentresponse.choices[0].message.content.strip()# 清理 markdown 标记ifcontent.startswith(json):contentcontent[7:]ifcontent.startswith():contentcontent[3:]ifcontent.endswith():contentcontent[:-3]returnjson.loads(content.strip())# 执行 if__name____main__:raw_data[{title: Python开发 ,company:腾迅,city:shenzhen,salary:25k-50k},{title:python工程师,company:阿里巳,city:杭州市,salary:30k-60k·15薪},{title:后端-Python,company:字节的跳动,city:bj,salary:20k-40k},{title: Python ,company:美团点评,city:北京,salary:面议},{title:python dev,company:网易,city:beijing,salary:100k-200k},{title:,company:某公司,city:上海,salary:15k-25k},{title:爬虫工程师,company:,city:深圳,salary:18k-35k},]print(f原始数据{len(raw_data)}条)print(\n原始数据预览)foriteminraw_data:print(f{item})print(\n正在用 AI 清洗...)cleanedclean_data_with_ai(raw_data)print(f\n清洗后{len(cleaned)}条)print(\n清洗结果)print(-*80)foritemincleaned:statusitem.get(clean_status,unknown)emoji{ok:✅,corrected:,abnormal:⚠️}.get(status,?)print(f\n{emoji}[{status}]{item.get(title)}{item.get(company)})print(f 城市{item.get(city)}| 薪资{item.get(salary_min)}-{item.get(salary_max)}k)ifitem.get(corrections):print(f 修正{item[corrections]})# 统计ok_countsum(1forxincleanedifx.get(clean_status)ok)corrected_countsum(1forxincleanedifx.get(clean_status)corrected)abnormal_countsum(1forxincleanedifx.get(clean_status)abnormal)print(f\n{*80})print(f统计正常{ok_count}条 | 已修正{corrected_count}条 | 异常{abnormal_count}条)# 保存withopen(cleaned_jobs.json,w,encodingutf-8)asf:json.dump(cleaned,f,ensure_asciiFalse,indent2)print(f已保存到 cleaned_jobs.json)预期输出原始数据7 条 正在用 AI 清洗... 清洗后5 条 清洗结果 -------------------------------------------------------------------------------- [corrected] Python开发工程师 腾讯 城市深圳 | 薪资25-50k 修正职位名标准化、公司名修正腾迅→腾讯、城市标准化 [corrected] Python开发工程师 阿里巴巴 城市杭州 | 薪资30-60k 修正职位名标准化、公司名修正阿里巳→阿里巴巴、城市标准化 [corrected] Python开发工程师 字节跳动 城市北京 | 薪资20-40k 修正职位名标准化、公司名修正、城市标准化 [corrected] Python开发工程师 美团点评 城市北京 | 薪资null-nullk面议 修正职位名标准化、空格清理 ⚠️ [abnormal] Python开发工程师 网易 城市北京 | 薪资100-200k 修正职位名标准化、公司名修正网易→网易、城市标准化 异常薪资超过100k可能不准确 统计正常 0 条 | 已修正 4 条 | 异常 1 条 已保存到 cleaned_jobs.json注意空title和空company的记录被自动删除了7 条变成了 5 条。四、批量清洗策略数据量大几千、几万条的时候不能一次性全丢给 AI。分批处理defbatch_clean(data,batch_size20):分批清洗数据all_cleaned[]foriinrange(0,len(data),batch_size):batchdata[i:ibatch_size]print(f正在清洗第{i1}-{ilen(batch)}条...)cleanedclean_data_with_ai(batch)all_cleaned.extend(cleaned)# 控制频率importtime time.sleep(1)returnall_cleaned先粗筛再精洗defsmart_clean(data):智能清洗先用规则快速处理再用 AI 精修importpandasaspd dfpd.DataFrame(data)# 第一步规则快速处理# 去空格forcolin[title,company,city]:ifcolindf.columns:df[col]df[col].str.strip()# 删除明显无效数据dfdf[df[title].notna()(df[title]!)]dfdf[df[company].notna()(df[company]!)]# 第二步AI 精修只处理需要语义判断的部分need_ai_cleandf.to_dict(records)cleanedbatch_clean(need_ai_clean,batch_size20)returncleaned先做不花钱的清洗去空格、删空值再用 AI 做需要语义理解的部分修正错别字、统一名称省钱。五、常见清洗场景1. 地址标准化prompt将以下地址统一为省-市-区格式。 地址列表 [北京市海淀区中关村, 上海浦东, 深圳南山科技园, 杭州余杭区文一西路] 返回 JSON 数组格式[{{original: 原文, province: 省, city: 市, district: 区}}]2. 文本分类prompt将以下职位分类到预定义类别中。 类别[后端开发, 前端开发, 数据分析, 产品经理, 运维, 测试, 其他] 职位列表 [Python后端, React前端, 数据分析师, PM, DevOps, QA工程师, 挖掘机司机] 返回 JSON[{{title: 职位, category: 类别, confidence: 0.95}}]3. 信息补全prompt根据公司名称补全以下信息如果不确定就填 null [ {{company: 字节跳动}}, {{company: 蚂蚁集团}}, {{company: 某不知名小公司}} ] 返回 JSON[{{company: 公司名, industry: 行业, size: 规模, founded_year: 年份}}]4. 异常检测prompt检查以下数据中的异常值 [ {{title: 实习生, salary: 50k-80k}}, {{title: CEO, salary: 5k-8k}}, {{title: Python开发, salary: 25k-50k}} ] 返回 JSON[{{index: 0, is_abnormal: true, reason: 实习生薪资过高}}]六、清洗质量的自我检查AI 清洗完不代表就对了要做检查defverify_cleaning(cleaned_data):检查清洗结果是否合理issues[]fori,iteminenumerate(cleaned_data):# 检查必填字段ifnotitem.get(title):issues.append(f第{i1}条缺少 title)# 检查薪资合理性salary_minitem.get(salary_min)salary_maxitem.get(salary_max)ifsalary_minandsalary_max:ifsalary_minsalary_max:issues.append(f第{i1}条最低薪资 最高薪资)ifsalary_max200:issues.append(f第{i1}条薪资异常高{salary_max}k)# 检查城市valid_cities[北京,上海,广州,深圳,杭州,成都,南京,武汉,西安,苏州]ifitem.get(city)anditem[city]notinvalid_cities:issues.append(f第{i1}条城市可能不正确 {item[city]})ifissues:print(发现以下问题)forissueinissues:print(f ⚠️{issue})else:print(✅ 清洗结果检查通过)returnissues 本篇成本透明栏项目数值API 调用次数约 5-50 次取决于数据量消耗 Token约 1-10 万 tokens成本¥0GLM-4.7-Flash 免费额度内GLM-4.7-Flash 免费额度足够清洗几千条数据。练手改造题改造 1基础用爬虫从任意网站抓一批数据不用多20 条就够然后写 AI 清洗代码把数据整理干净。改造 2进阶写一个清洗管道先从 CSV 读取原始数据 → 用规则做基础清洗去空格、删空值→ 用 AI 做语义清洗标准化、纠错→ 输出干净的 CSV。整个流程一键运行。下期预告Day 13 · AI 辅助解析复杂表格和嵌套结构有些页面的结构复杂到XPath写不出来——嵌套表格、混合排版、图文混排。Day 13 教你把页面截图丢给视觉模型 GLM-4.6V-Flash直接让它看图说话输出结构化数据。 资源与工具智谱 BigModelGLM-4.7-Flash 免费https://open.bigmodel.cn/pandas 数据清洗文档https://pandas.pydata.org/docs/user_guide/text.html本专栏配套代码CSDN 下载区每篇更新梅雅达编程笔记专注 Python AI 实战教程提供数据采集与自动化定制服务往期回顾Day 01 · 爬虫能干啥不能干啥Day 02 · 环境搭建与第一个爬虫Day 03 · 列表页抓取批量拿数据Day 04 · 详情页 翻页从一条到一百条Day 05 · Ajax 请求拦截抓看不到的数据Day 06 · 浏览器自动化DrissionPage 实战Day 07 · Cookie 与 Session处理登录状态Day 08 · 反爬对策Headers 限速 代理Day 09 · 存成文件CSV / Excel / JSONDay 10 · 存进数据库SQLite 从零上手Day 11 · 用 AI 替代正则智能提取结构化数据专栏推荐「AI Python 系列」第 03 栏 · Python 爬虫实战连载中「AI Python 系列」第 01 栏 · AI自动化办公连载中「AI Python 系列」第 02 栏 · AI数据可视化连载中「AI Python 系列」第05栏 · AI Agent实战连载中资源领取关注作者获取本栏完整代码和数据集原创声明本文为梅雅达编程笔记原创作品未经允许不得转载。
返回列表