资讯详情

资讯详情

用Prompt做数据清洗:缺失值异常值标注实战指南

1. 为什么我会想用Prompt来做数据清洗先说说我遇到的实际场景。上个月处理一份十几万行的渠道运营数据字段大概有用户ID、注册时间、活跃时长、付费金额、设备型号这五列结果打开一看差点没绷住注册时间里有不知道3月份去年这种描述付费金额列里既有0元也有-5还有空着的、写待定的设备型号更是五花八门什么iPhone 13 Pro Max苹果13iphone13promax全都有。传统做法是什么写一堆pandas脚本对所有列做value_counts看分布然后逐个if判断识别异常值。这套流程我做过无数次最大的问题不是写不出来而是每换一份数据都要重新写一遍规则。而且规则写得越细代码越臃肿动辄一两百行的清洗函数下个月自己看都觉得头疼。后来我开始尝试用AI的Prompt来做这件事思路发生了转变我不再告诉机器具体哪一列需要怎么清洗而是把数据样例和清洗要求直接扔给大模型让它帮我标注出缺失值和异常值我再基于标注结果去处理。这套流程跑顺之后清洗效率确实提升了一个档次。这篇文章适合谁看如果你是数据分析师、数据开发工程师或者只是偶尔需要处理Excel表格但不想写复杂脚本的同学下面这套用Prompt做数据清洗的方案都值得你试一下。我不打算只讲概念而是把完整的Prompt模板、实测结果、踩过的坑都放出来你可以直接复制修改就能用。2. Prompt做数据清洗的原理边界它到底能干什么先说清楚原理不然你后面用起来会觉得AI像个黑盒出了问题也不知道怎么调。2.1 大模型识别脏数据的本质是语义理解模式识别跟传统规则清洗相比Prompt清洗最核心的差异在于规则清洗靠的是程序员预先定义异常模式而Prompt清洗靠的是模型对数据语义的理解。比如177岁这种年龄字段规则清洗需要你写age 120才算异常而大模型看到这个值结合年龄这个字段名和上下文的整体分布自己就能判断这是一个不合常理的值。具体到能力边界我总结下来有三个层次缺失值识别这是最容易搞定的。大模型对NULL、NaN、None、空字符串、N/A、未知、待定、-这类缺失值表示方式非常敏感即使你的数据里有unknown这种英文写法或者数据暂缺这种口语化描述它也能识别出来。异常值标注分两种情况。一种是业务规则异常比如性别字段出现未知生物、付费金额出现非数值这种大模型靠常识就能判断。另一种是统计分布异常比如某天的活跃时长突然是平时的100倍模型会结合该列的整体分布给出疑似异常的标注而不是简单地一刀切。规则解释与输出大模型不只是告诉你这行有问题它还能用自然语言解释为什么判定为异常这个解释对后续的人工复核特别有价值。2.2 三个绝对不能越过的使用边界这个我必须放在前面讲因为你一旦越界结果会很难收拾。第一大模型不能盲目修改数据只能做标注。你可以让AI输出第几行第几列缺失但绝不能让AI直接给你填好的数据。为什么因为模型的“补全”本质是在猜测而数据清洗中任何猜测性的补值都必须在人工确认后进行。我见过有人让AI直接补缺失值结果AI把付费金额缺失的填成了0这完全改变了业务含义——缺失可能是用户没付费也可能是系统没记录不能等同处理。第二数据量有严格限制。大模型上下文窗口是有限的我实测下来单次让AI处理几百行数据效果最好超过一千行它就容易糊涂开始编模式、漏标注。所以推荐的做法是抽样让AI标注或者把数据分片传入甚至只让AI生成清洗规则然后你用Python去执行这在后面会细讲。第三不要指望AI一次就做对。Prompt清洗本质是人机协作——AI给出标注结果你审核后再执行。它帮你节省的是理解数据分布、编写识别逻辑的时间而不是帮你免掉人工复核。这个过程跟带新人很像你交代任务很清楚但拿到结果还是得检查一遍。搞清楚边界之后下面这两套Prompt模板是我实测下来效果最稳定的方案一套走缺失值标注一套走异常值标注你可以直接拿去用。3. 缺失值自动标注的完整Prompt方案缺失值识别看起来简单但实际执行时最烦人的是缺失值长得千奇百怪。有真空的NULL、NaN、空字符串有伪空的无、暂无、-、unknown还有空格符、全角空格之类的视觉陷阱。纯靠代码规则去写你要穷尽所有情况累且容易漏。3.1 设定AI角色为什么系统提示词这么重要先放我实测后最稳定的系统提示词你是一名资深数据质量分析师。你的任务是根据我提供的表格数据识别并标注其中所有的缺失值。 你对缺失值的定义很宽泛包括但不限于 1. 标准空值NULL、NaN、None、空字符串 2. 占位性文本N/A、NA、null、nan、unknown、- 3. 业务语境下的缺失表达暂无、待定、未填写、未知、无、不适用、缺失、数据暂缺 4. 纯空白文本全角空格、半角空格、制表符等不可见字符 5. 特殊占位符?、、...、0000、9999 你绝对不能做的 - 不要将0视为缺失值除非数字0在业务语境下明确表示无数据 - 不要将正常的业务文本如设备型号iPhone-13误判为缺失值 - 不要猜测缺失值的原因只要标注缺失/疑似缺失即可 输出格式要求 1. 以表格形式输出结果包含行号、列名、原始值、缺失类型标准空/占位文本/业务缺失/空白字符 2. 如果缺失值为0条输出未发现缺失值 3. 输出完结果后单独列出标注建议给每个缺失值推荐一个处理方向删除/填充均值/填充特殊值/保留标记为什么要把定义写得这么细因为大模型对缺失值的默认理解是NULL或者NaN如果不在提示词里展开定义它就会漏掉暂无待定这类业务语境下的缺失值。我第一次测试时没展开定义AI直接把0元当成了缺失值导致误报率特别高。你把这个系统提示词用上之后识别范围就宽了而且不会把0误判。3.2 用户消息里必须带的三类信息系统提示词设定好之后用户消息也很关键。我梳理了一个标准模板每次只用替换占位内容即可【待清洗数据】 用户ID,注册时间,活跃时长,付费金额,设备型号 1001,2024-01-15,35.5,68.00,iPhone 13 1002,暂无,12,0,华为P40 1003,2024-02-03,,,小米12 1004,2024-02-03,56.8,88.50,荣耀X10 1005,未知,44,120.00,- 1006,2024-03-11,23.6,35.00,Oppo A5 1007,2024-03-12,,45.50,三星S22 1008,2024-03-12,18.4,0,苹果14 1009,2024-04-01,66.6,99.99,一加9 1010,2024-04-05,42.1,202.00,[未知型号]【标注要求】请根据系统提示词中的缺失值定义逐行扫描上述数据特别注意某些列使用空字符串或空白字符表示无数据请仔细辨别对每一行给出标注结果并说明判断依据数据样例我给你拆解一下第2行注册时间是暂无属于业务语境缺失第3行活跃时长和付费金额都是空的这是标准空值第10行设备型号[未知型号]是带占位符的缺失表达。你把这样的样本发给AI它就能按你的定义逐类标注。3.3 实测输出效果AI给的缺失值报告长什么样我跑完之后AI的输出是这样的精简版行号列名原始值缺失类型标注建议2注册时间暂无业务语境缺失保留并标记为未注册不填充3活跃时长(空)标准空值若该用户有付费记录可填充中位数3付费金额(空)标准空值建议填充为0需业务确认或保留缺失标记5设备型号-占位文本填充未知设备或按其他归类7活跃时长(空)标准空值可参考同周用户活跃时长填充均值10设备型号[未知型号]业务语境缺失归入其他分类不参与设备维度分析3.4 一个重要提醒AI建议里的坑这个输出看着挺好但你注意第3行的付费金额AI建议填充为0需业务确认——这就是我前面说的AI容易踩的坑。付费金额为空可能是用户确实没付费也可能是支付回调没记录绝不能盲填0。所以我在Prompt里明确加了不要猜测缺失值的原因但实际输出时AI还是会给出一些倾向性建议。我的处理方式是把AI的标注建议当成参考方向最终填不填、填什么必须让熟悉业务的人拍板。这套方案直接解决的是漏标和误标问题。以前你用代码匹配写df.isnull()只能识别NaN业务语境缺失全靠later处理现在扔给AI它能把暂无未知-全给你圈出来一步到位。4. 异常值自动标注的完整Prompt方案异常值标注比缺失值更微妙因为异常的定义高度依赖业务语境。同样是付费金额0在免费试用业务里是正常的在付费转化业务里可能就异常同样是活跃时长600分钟对看视频的用户可能正常对办公类App用户就值得怀疑。所以Prompt的设计要分两层第一层识别违反业务常识的值第二层识别偏离整体分布的值。4.1 业务规则异常统计分布异常的双层提示词我的做法是把这俩维度写进同一个Prompt让AI分别标注打上不同的异常等级标签【系统提示词补充】 你是一名资深数据质量分析师任务是识别并标注表格中的异常值。 异常值分为两类 1. 业务规则异常一级异常违反业务常识的值。例如 - 负数订单金额为-5元、温度为-30度时需结合场景判断 - 超出合理范围的值年龄为200岁、单日活跃时长为1440分钟以上 - 格式错误的值邮箱不含、手机号不足11位、日期格式混乱 - 逻辑矛盾的值注册时间晚于最后登录时间、订购数大于库存数 2. 统计分布异常二级异常虽然值本身可能合法但明显偏离该列整体分布。例如 - 数值超出均值加减3个标准差 - 出现频率极低但数值又特别极端的值 - 与同组其他记录的同类字段存在明显不一致的表达如iPhone 13和苹果13同时出现 【标注要求】 - 对每一行数据如果存在异常输出行号、列名、原始值、异常类型一级异常/二级异常、异常说明、处理建议 - 如果该行同时存在多个异常分多条输出 - 如果该行无异常不输出 - 对于一级异常明确标注建议删除或修正对于二级异常标注建议复核或归一化处理这里为什么把异常值分成两级因为处理方式完全不同。一级异常通常是数据录入错误比如负数、超范围日期这种基本可以直接处理二级异常可能只是表达不规范比如iPhone 13和苹果13明明是一个东西机器却以为是两个值这种需要归一化而不是删除。混在一类里会让后续处理很纠结分级之后处理策略就清楚了。4.2 用一份包含多种异常的实验数据实测跑一遍我构造了一份实验数据来测这套Prompt订单ID,商品名称,订单金额,下单时间,用户ID A001,无线耳机,299,2024-05-10,u_101 A002,手机壳,49.9,2024-05-10,u_102 A003,数据线,-20,2024-05-11,u_103 A004,防晒霜,88,2024-05-12,u_104 A005,空,99999,2024-05-13,u_105 A006,键盘,199,2024-05-14,u_102 A007,鼠标,5000,2024-05-15,u_106 A008,显示器,1299,2024-05-16,u_107 A009,机械硬盘,599,2024/5/17,u_108 A010,笔记本,7999,2024-13-01,u_109 A011,显示器,1299,2024-05-16,u_107 A012,鼠标垫,25,2024-05-20,u_110这里我埋了几个典型异常A003金额-20元这是负数异常A004金额空和A007金额5000元——一个被填成空文本一个数值远超整个分布A005日期2024/5/17是格式不一致A008日期2024-13-01月份超界这是典型的一级异常A001和A010又是显示器1299的重复数据虽然在异常值标注里不算异常但你如果做去重会需要单独处理。AI的输出结果同样很清晰行号列名原始值异常类型异常说明处理建议A003订单金额-20一级异常订单金额不允许为负数删除或修正为绝对值需核对原始订单A004商品名称(空)一级异常商品名称为空且金额为空复核该订单归属的商品信息A005订单金额99999一级异常金额99999远超该类目商品价格范围确认真实金额若为测试数据可删除A007订单金额5000二级异常鼠标价格5000元显著偏离其他订单的金额分布均值约65元复核交易真实性确认是否为大额采购A008下单时间2024-13-01一级异常日期格式非法13月不存在还原真实下单日期或标记为异常时间A010下单时间2024-13-01一级异常同上同上4.3 关于边界值处理的一个实操经验你可能会问AI标注的二级异常怎么确认我处理这类值有一个原则——不直接删而是让AI把偏离均值多少个标准差也写出来。你可以在Prompt里加一句如果该异常值属于统计分布异常请同时计算该值相对该列均值偏离了几个标准差。这样你能看到5000元相对65元均值偏离了几十倍处理起来有数据支撑。还有一个经验**越界日期、负数这类一级异常AI的判断几乎不会出错可以直接信。但二级异常的判断AI偶尔会误伤正常值。**比如某产品销量在双11那天暴涨到平时的50倍这确实是正常的业务高峰AI却会标记为异常。这类情况需要在Prompt里加一条豁免规则如果该列的异常值集中出现在某个时间段且彼此数值相近视为业务周期波动而非异常。加了这个之后误报率明显下降。5. 「数据样例标准约束」三段式让Prompt稳定输出的核心方法论如果你把上面两个方案跑通了会发现一套模板真正稳定下来靠的不只是提示词长短而是设计结构。我把这套可复用的方法论拆成三段以后处理任何数据清洗任务你照这个思路写Prompt就行。5.1 第一段数据样例一定要带真实格式很多人在Prompt里只写请清洗以下数据然后直接贴一大段原始数据。这样模型缺少对照容易把清洗标准定偏。正确做法是先给出字段说明和2-3行样例再贴完整数据。比如字段说明 - 用户ID字符串唯一标识 - 注册时间日期类型格式YYYY-MM-DD - 付费金额数值类型单位为元保留两位小数 - 设备型号字符串表示用户手机型号 样例数据 1001,2024-01-15,68.00,iPhone 13这样AI就会明白日期就该是2024-01-15这种格式金额不该出现-20设备型号不该用别名。样例是模型判断所有数据对错的基准线这个基准线越清晰标注准确率越高。5.2 第二段清洗标准要像技术方案一样明确不要只写找出异常值这种模糊要求要把什么是异常写明白。我常用的分类维度是格式层是否符合字段规定的格式语义层值本身是否违反业务常识分布层值是否偏离整体分布一致性层同一实体是否有不同表达如iPhone 13/苹果13把这四个维度写进PromptAI就会在四个层面分别扫描输出也会有条理得多。我在第4章的Prompt里已经把这四个维度拆进去了所以输出结果是分类分层的不会被混在一起。有一点需要特别强调约束条件要写在要求的后面而不是前面。比如你希望AI不要零值如0判定为缺失你要放在缺失值识别要求的后面写注意数字0不应判定为缺失值除非有业务说明。放在后面之所以效果更好是因为模型读提示词时对最后强调的内容记忆权重更高这是我做多轮对比测试发现的。5.3 第三段给AI规定一个固定的输出格式这是整套Prompt里最容易被人忽略、却是提升效率最大的一环。如果你不给AI规定输出格式它可能输出一段长文本你得肉眼去里面找结果如果你规定了格式AI会按你的格式输出表格你可以直接复制到Excel或者用Python读取。我最常用的格式约定是输出格式要求严格遵守 1. 只输出Markdown表格不要输出任何额外的解释性文字 2. 表格列为行号、列名、原始值、问题类型、判断依据、处理建议 3. 如果没有发现问题输出一行文字未发现目标问题 4. 每一行数据最多输出一条标注结果多条问题合并到判断依据列 5. 日期统一使用YYYY-MM-DD格式第4条之所以重要是因为AI有时候会针对同一行连续输出好几条标注跟你要做的清洗动作对不上。合并成一条之后每条记录对应一个处理动作执行起来就像查表一样方便。6. 从Prompt到落地把AI标注结果跟pandas跑通Prompt方案单独用适合小批量数据但在生产环境里十几万行的数据怎么靠AI标注这里我分享一套AI标规则、脚本跑全量的组合打法这也是我后来主要使用的落地方式。6.1 让AI生成pandas清洗规则的实操流程当数据量太大你其实不需要让AI逐行标注而是换个思路让AI分析数据样例生成可复用的pandas清洗代码你用这份代码去跑全量数据。具体步骤是这样的第一步抽样切片。从全量数据里抽200-500行尽量覆盖各种边界情况。你可以用df.sample(500)随机抽也可以手动拼接一些包含已知异常值的行。第二步把样本数据发给AIPrompt改一下请分析以下数据样例识别可能的缺失值和异常值模式然后生成一段Python pandas代码 1. 能够自动标注缺失值注意识别业务语境缺失和标准空值 2. 能够标注异常值分为一级异常和二级异常 3. 代码中必须包含processed_flag列normal表示正常missing表示缺失abnormal_1表示一级异常abnormal_2表示二级异常 4. 代码要求使用纯pandas实现不依赖其他库 5. 最后用print输出标注结果的统计信息第三步AI生成的代码示例大概是这个风格import pandas as pd import numpy as np df pd.read_csv(your_data.csv) def flag_missing_values(df): 标注缺失值标准空值 业务语境缺失 missing_patterns [None, np.nan, , , 暂无, 未知, 待定, N/A, -, unknown, null] df[processed_flag] normal for col in df.columns: # 标准空值检测 is_std_null df[col].isnull() | (df[col].astype(str).str.strip() ) # 业务语境缺失检测 is_biz_null df[col].astype(str).str.strip().str.lower().isin( [p.lower() for p in [暂无, 未知, 待定, N/A, -, unknown, null]] ) df.loc[is_std_null | is_biz_null, processed_flag] missing df.loc[is_std_null | is_biz_null, 异常说明] f{col}列存在缺失值: df.loc[ is_std_null | is_biz_null, col ].astype(str) return df def flag_abnormal_values(df, numeric_colsNone): 标注异常值一级异常越界/非法值 二级异常统计分布偏离 if numeric_cols is None: numeric_cols df.select_dtypes(include[np.number]).columns.tolist() for col in numeric_cols: col_series pd.to_numeric(df[col], errorscoerce) mean_val col_series.mean() std_val col_series.std() # 二级异常偏离均值3个标准差 is_abnormal_2 (col_series - mean_val).abs() 3 * std_val df.loc[is_abnormal_2 (df[processed_flag] normal), processed_flag] abnormal_2 df.loc[is_abnormal_2 (df[processed_flag] normal), 异常说明] ( f{col}列数值{col}偏离均值超过3个标准差 ) return df df flag_missing_values(df) df flag_abnormal_values(df) print(df[processed_flag].value_counts()) print(df[df[processed_flag] ! normal])第四步拿AI生成的代码去跑全量数据抽检结果。这套打法的核心价值是AI帮你把规则思维转化成了可执行代码你只需要审核代码逻辑是否合理不需要自己从零写。6.2 人工抽检确认AI标注结果能放心用AI生成代码不代表可以直接上生产抽检是必要的。我一般会做两个动作随机抽取100条被标注为normal的数据肉眼复查有没有遗漏的异常值。如果100条里发现超过2条漏标说明Prompt里的规则还没覆盖这类情况需要补充规则再跑一次。对被标注为abnormal_1和abnormal_2的数据每条都比对业务口径。重点看二级异常那批因为一级异常大多是硬伤二级异常有误伤可能。6.3 实测数据Prompt方案到底比纯手写好在哪里我拿手头那份十几万行的数据做过一个对比结果可以参考方案耗时漏标情况误标情况备注纯pandas手写规则约2小时业务语境缺失漏标约12%误标约3%需人工反复调试规则Prompt标注全量逐行约40分钟API调用漏标约3%误标约5%受上下文限制需分片且需处理API限流Prompt生成规则pandas执行约15分钟漏标约1.5%误标约2%人工只需审核代码逻辑执行效率最高我目前用的就是第三种方案。前两种太受限于上下文长度或规则灵活性第三种方案把AI的语义理解能力和程序的执行效率做了结合准确率和效率都可控。6.4 关于API调用的一个补充建议全量逐行让AI跑除了限流问题成本也不低。我建议在Prompt里加一个批量处理模式如果数据超过200行不要逐行输出标注结果。改为输出以下两类内容 1. 异常值分布统计摘要 2. 建议处理的pandas代码这样AI就会自动走规则生成路线而不是傻乎乎地逐行标注。对于超大数据集这是唯一的可行方案。7. 实测中的坑prompt闪退、flagged提示、结果不稳定怎么处理最后这部分集中分享我在实际操作中遇到的高频问题——你搜索相关热词时也会看到prompt闪退、invalid prompt这类关键词。7.1 大模型提示potentially violating usage policies怎么办这种情况通常发生在你上传的数据里包含敏感字段比如身份证号、手机号、邮箱或者一些外部聊天接口/页面本身有内容安全机制。如果你的Prompt和数据触发这个提示不要慌解决方案是把数据脱敏。我的经验是先把真实数据里的敏感列过滤掉比如把用户ID改成u_101这种不关联真实用户的形式。如果你明确知道某列包含个人信息在Prompt开头先声明注意以下数据已经脱敏处理不包含真实个人信息。数据中的用户ID为随机值。这条声明配合脱敏数据能显著降低触发概率。另有一步如果数据里的文本有脏词比如设备型号里带感叹号、表情符号也会提高风险命中率。我会让AI在标注之前先做一层数据消毒——把所有非ASCII符号替换为文本描述再喂给模型。实际测试下来非常管用。7.2 prompt闪退、长文本截断的规避方案长文本对话界面闪退多半是两个原因一是一次性粘贴的数据太多超出上下文限制二是平台的长文本处理不稳定导致会话中断。我习惯把数据切分成小份再喂给AI固定操作是每次最多500行或者控制整个Prompt加数据总量在几千字符以内。为了省事我写了个小程序来做分片def split_data_for_ai(df, chunk_size200): 把DataFrame分片供AI模型批量处理 chunks [] total_chunks (len(df) chunk_size - 1) // chunk_size for i in range(total_chunks): chunk df.iloc[i * chunk_size : (i 1) * chunk_size] chunks.append(chunk) return chunks分片之后逐批把数据发给AI结果集中汇总这样既不会闪退也能单批得到准确的标注结果比一次性丢进去得到的准确率高不少。另一方面如果你的Prompt特别长我建议把核心指令放在最前面样例数据放最后——模型对指令开头和结尾的内容记忆最清晰中间部分权重会低一些。7.3 最麻烦的情况AI标注结果前后不一致这个问题我碰到很多次。同样的数据上午跑出来的标注结果和下午跑出来的不一样。这不是玄学通常是因为你的Prompt里有模糊表述。举个例子你在Prompt里写识别不合理的值这个不合理太模糊了AI每次理解的语义可能略有差异。解决办法是模糊表述全部量化。我在第4章已经把异常值定义成了超过均值3个标准差这就是一个明确的标准缺失值我在第3章列出了穷举清单不让AI自由发挥。标准越明确结果越稳定。定量描述越细AI的可发挥空间越小。还有一个技巧给AI一个输出顺序约束。比如按行号从小到大输出同一列的问题只输出一次稳定输出顺序本质上是稳定了模型的工作节奏结果一致性有明显提升。7.4 多模型协作的延伸思路如果你手头有多个AI模型可用比如有些场景接口不稳定可以试试多模型搭档一个模型做数据预分析生成遗漏值的候选清单另一个模型做交叉验证两个结果对齐只有两边都标记为异常才进入处理清单。这样能把单模型偶尔的幻觉因素抑制下来。我在生产环境跑重要数据时会保留这一步虽然耗时翻倍但出错率基本趋近于零。8. 最后这套方法我用了几个月的体会从最开始在聊天网页里粘贴几百行数据让AI标注到现在用AI生成pandas规则跑全量这条路我走了几个月。最大的感受是Prompt清洗解决的不是会不会写代码的问题而是面对又脏又乱的数据能不能快速形成清洗思路的问题。以前拿到脏数据我得先花一两个小时摸清数据分布才有可能写出对的清洗规则现在把样本丢给AI三分钟内就能看到完整的缺失值和异常值分布报告再基于这个结果决定怎么处理。但我也想泼一盆冷水AI在这个流程里是聪明的助手不是靠谱的执行者。它的标注、解释、建议都有参考价值但必须有人把关。特别是涉及业务语义的判断——这个值到底算不算异常、缺失之后要不要填充、归到哪个分类——这些决策权必须留给人。你越懂业务Prompt清洗的准确率越高因为你能在Prompt里把业务规则写得更清楚也能更敏锐地发现AI标注里的错误。如果你打算试这套方法我建议从最简单的场景切入找一份几百行的脏数据用第3章和第4章的模板跑一遍先看AI的标注结果准不准再决定要不要往pandas落地。等跑顺了你会发现让AI看懂我的数据这件事比让AI处理数据更值钱——因为前者能帮你节约后面无数次的重复劳动。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →