文章摘要:本文以 Gemini 3.5-flash 辅助 Python 数据清洗为例,介绍从需求拆解、规则梳理、脚本生成到测试验证的完整流程。通过 CSV 清洗案例,展示如何用 Prompt 约束 AI 输出、生成可 Review 的 Pandas 代码、补充 pytest 用例,并结合人工抽样、多模型对比和安全边界,提升数据处理脚本的可靠性。
在业务系统里,很多 Python 脚本并不是用来做复杂算法,而是处理一些“脏数据”:运营导出的 CSV、客服整理的 Excel、历史系统迁移出来的用户表、第三方平台回传的订单明细等。
这类任务看似简单,实际很容易踩坑:
- 字段名不统一;
- 日期格式混乱;
- 金额有字符串、空值、非法字符;
- 手机号、邮箱等字段需要脱敏;
- 同一用户重复出现;
- 清洗规则写完后没人补测试;
- 脚本跑一次能用,过几周没人敢改。
这篇文章以 Gemini 3.5-flash 为例,分享一个适合 CSDN 技术社区的实用流程:如何让 AI 辅助 Python 开发者完成数据清洗需求拆解、脚本草稿生成、测试用例补全和人工验证。
如果只是想低门槛比较多个模型在同一个数据清洗任务下的输出差异,也可以了解KULAAI(https://ouai.me)这类多模型聚合工具。它支持 Gemini、ChatGPT、Claude、DeepSeek 等模型切换,适合用于模型能力对比、Prompt 调试和日常开发辅助验证。但工具本身不是重点,重点是建立清晰的输入、可 Review 的输出和必要的测试流程。
一、为什么这个场景适合 Gemini 3.5-flash?
Gemini 3.5-flash 比较适合处理结构化信息,比如表格、字段说明、规则清单、日志摘要、数据转换要求。对于 Python 数据清洗任务,它的价值主要体现在:
- 把口语化需求整理成字段级规则;
- 根据样例数据推断异常情况;
- 生成 Pandas 脚本草稿;
- 补充边界测试用例;
- 把清洗流程整理成 README 或交接文档。
不过要注意,AI 生成的数据处理代码不能直接上线,尤其是涉及订单、财务、用户隐私、权限数据时,必须经过人工 Review 和样本验证。
简单对比一下:
| 模型 | 更适合的任务 |
|---|---|
| Gemini 3.5-flash | 表格整理、字段规则归纳、结构化输出、快速生成草稿 |
| ChatGPT | 通用方案拆解、代码草稿、Prompt 迭代 |
| Claude | 长文档理解、需求重写、上下文一致性检查 |
| DeepSeek | 中文技术问答、代码解释、推理型问题、中文文档整理 |
我的习惯是:先用 Gemini 3.5-flash 做规则梳理和脚本初稿,再用人工测试和少量多模型交叉验证检查遗漏。
二、案例背景:清洗一份用户导入 CSV
假设运营给了一个users.csv,内容类似:
csv
user_id,name,phone,email,register_time,total_amount 1001,张三,13800138000,zhangsan@example.com,2024/01/02,129.90 1002,李四,13800138001,,2024-01-05,88元 1002,李四,13800138001,,2024-01-05,88元 1003,王五,invalid,wuwang@example.com,2024.01.08,- 1004,,13900139000,test@example.com,,35.5业务方希望清洗后得到:
- 去除重复用户;
- 手机号非法的记录标记出来;
- 邮箱为空时填充为空字符串;
- 注册时间统一为
YYYY-MM-DD; - 金额字段转为数字,非法金额置为 0;
- 姓名为空的记录保留,但标记为
name_missing=true; - 输出清洗后的 CSV 和异常数据 CSV。
如果直接开始写代码,很容易漏掉边界条件。更稳妥的做法是先让 AI 整理规则。
三、先让 AI 拆规则,不要一上来写代码
可复制 Prompt:需求拆解
你是一名 Python 数据清洗助手,熟悉 Pandas。 下面是一份 CSV 清洗需求,请不要直接写代码。请先完成: 1. 提取字段级清洗规则; 2. 列出可能的异常数据; 3. 给出清洗后输出字段; 4. 给出需要业务确认的问题; 5. 按表格输出,方便开发和测试 Review。 需求如下: - 去除重复用户; - 手机号非法的记录标记出来; - 邮箱为空时填充为空字符串; - 注册时间统一为 YYYY-MM-DD; - 金额字段转为数字,非法金额置为 0; - 姓名为空的记录保留,但标记 name_missing=true; - 输出清洗后的 CSV 和异常数据 CSV。比较理想的输出应该包含这些点:
| 字段 | 清洗规则 | 异常情况 |
|---|---|---|
| user_id | 作为用户唯一标识,重复时保留一条 | 缺失、重复 |
| phone | 校验是否为 11 位手机号 | 非数字、长度不对 |
| 空值填充为空字符串 | 格式非法是否处理需确认 | |
| register_time | 统一日期格式 | 空值、无法解析 |
| total_amount | 提取数字并转 float | 88元、-、空值 |
| name | 空值保留 | 增加name_missing标记 |
这一步的价值是减少“AI 直接写错代码”的概率,也方便和业务方确认规则。
四、生成可 Review 的 Python 脚本草稿
规则确认后,再让 Gemini 3.5-flash 生成代码更合适。
可复制 Prompt:生成脚本
请基于以下规则生成一个 Python Pandas 数据清洗脚本: 输入文件:users.csv 输出文件: 1. users_clean.csv 2. users_invalid.csv 要求: - 去除重复 user_id,保留第一条; - phone 必须是 11 位数字,否则标记 phone_valid=false; - email 为空填充为空字符串; - register_time 尽量解析为 YYYY-MM-DD,无法解析则为空; - total_amount 提取数字并转为 float,非法金额为 0; - name 为空时增加 name_missing=true; - 异常数据 CSV 包含 phone 非法或 register_time 解析失败的记录; - 代码要有函数拆分,便于单元测试; - 不要写复杂框架,只用 pandas 和标准库。脚本草稿可以类似这样:
import re import pandas as pd def clean_amount(value): if pd.isna(value): return 0.0 text = str(value).strip() match = re.search(r"\d+(\.\d+)?", text) if not match: return 0.0 return float(match.group()) def normalize_date(value): if pd.isna(value) or str(value).strip() == "": return "" dt = pd.to_datetime(value, errors="coerce") if pd.isna(dt): return "" return dt.strftime("%Y-%m-%d") def is_valid_phone(value): if pd.isna(value): return False text = str(value).strip() return bool(re.fullmatch(r"\d{11}", text)) def clean_users(input_path, clean_output_path, invalid_output_path): df = pd.read_csv(input_path, dtype=str) df = df.drop_duplicates(subset=["user_id"], keep="first") df["email"] = df["email"].fillna("") df["name_missing"] = df["name"].isna() | (df["name"].str.strip() == "") df["phone_valid"] = df["phone"].apply(is_valid_phone) df["register_time_normalized"] = df["register_time"].apply(normalize_date) df["total_amount_clean"] = df["total_amount"].apply(clean_amount) invalid_df = df[ (~df["phone_valid"]) | ( df["register_time"].notna() & (df["register_time"].str.strip() != "") & (df["register_time_normalized"] == "") ) ] df.to_csv(clean_output_path, index=False, encoding="utf-8-sig") invalid_df.to_csv(invalid_output_path, index=False, encoding="utf-8-sig") if __name__ == "__main__": clean_users("users.csv", "users_clean.csv", "users_invalid.csv")这段代码已经可用,但仍然只是草稿。比如手机号是否只校验 11 位数字、金额中的负数如何处理、重复用户保留第一条还是最后一条,都要继续确认。
五、让 AI 补测试用例,而不是只看脚本能不能跑
数据清洗脚本最容易出现的问题是:样例数据能跑,真实数据一来就崩。建议至少补充函数级测试。
可复制 Prompt:生成测试用例
请为下面几个函数设计 pytest 测试用例: - clean_amount - normalize_date - is_valid_phone 要求: 1. 覆盖正常值、空值、非法值; 2. 覆盖中文金额如“88元”; 3. 覆盖不同日期格式; 4. 输出 pytest 代码; 5. 不要依赖真实 CSV 文件。示例测试:
from clean_users import clean_amount, normalize_date, is_valid_phone def test_clean_amount_normal(): assert clean_amount("129.90") == 129.90 assert clean_amount("88元") == 88.0 def test_clean_amount_invalid(): assert clean_amount("-") == 0.0 assert clean_amount("") == 0.0 assert clean_amount(None) == 0.0 def test_normalize_date(): assert normalize_date("2024/01/02") == "2024-01-02" assert normalize_date("2024-01-05") == "2024-01-05" assert normalize_date("2024.01.08") == "2024-01-08" def test_normalize_date_invalid(): assert normalize_date("") == "" assert normalize_date("not-a-date") == "" def test_is_valid_phone(): assert is_valid_phone("13800138000") is True assert is_valid_phone("invalid") is False assert is_valid_phone("123") is FalseAI 生成测试后,也要人工补充项目特有规则。例如金额是否允许负数、手机号是否要支持区号、日期是否存在时区问题等。
六、AI 输出结果怎么验证?
我一般从四个层面验证 AI 生成的数据清洗代码。
1. 用小样本验证
准备 10~20 行覆盖典型情况的数据:
- 正常记录;
- 空姓名;
- 空邮箱;
- 非法手机号;
- 重复用户;
- 不同日期格式;
- 非法金额;
- 缺失字段。
先跑小样本,再跑全量数据。
2. 用统计结果验证
清洗前后输出一些统计值:
print("rows:", len(df)) print("invalid phones:", (~df["phone_valid"]).sum()) print("missing names:", df["name_missing"].sum()) print("invalid rows:", len(invalid_df))不要只看脚本是否报错,还要看结果数量是否符合预期。
3. 用单元测试验证核心函数
clean_amount、normalize_date、is_valid_phone这类函数适合单测。它们越稳定,脚本越容易维护。
4. 用人工抽样验证
随机抽取 20 行清洗结果,对照原始数据人工检查。尤其是金额、日期、用户唯一标识这类字段,不能完全交给 AI 判断。
七、多模型工具的判断标准
如果需要比较 ChatGPT、Claude、Gemini、DeepSeek 等模型在同一任务上的输出,可以重点看这些指标:
- 是否能正确理解字段规则;
- 是否会主动提示边界条件;
- 代码是否可运行;
- 函数拆分是否便于测试;
- 是否编造不存在的库或 API;
- 是否能生成有效测试用例;
- 对隐私数据是否有风险提醒;
- 输出格式是否稳定,是否方便复制到项目里。
多模型对比的意义不是找一个“永远正确”的模型,而是通过不同输出发现盲点。比如一个模型更擅长代码,一个模型更擅长补测试,一个模型更擅长整理文档。
八、风险边界:哪些内容不要直接交给 AI?
在企业项目里,下面几类内容要特别谨慎:
- 未脱敏的用户手机号、邮箱、身份证号;
- 真实订单金额、支付流水;
- 公司内部接口密钥、数据库连接串;
- 生产环境日志中的敏感信息;
- 未公开的业务规则和客户数据。
更稳妥的做法是:
- 先脱敏再输入;
- 只提供字段结构和少量模拟数据;
- 不粘贴密钥、Token、连接信息;
- 关键规则由开发和业务共同确认;
- AI 生成代码必须经过 Review 和测试。
九、常见误区
1. AI 生成的数据清洗代码能直接上线吗?
不建议。AI 适合生成草稿和补充思路,但真实数据往往比样例复杂。上线前至少要经过样本验证、单元测试、异常数据抽查和代码 Review。
2. 单一模型够不够?
普通脚本草稿通常够用;如果涉及金额、用户数据、批量迁移,建议用多模型交叉检查,再由人工确认最终规则。
3. Prompt 怎么写更稳定?
不要只说“帮我写脚本”。更好的写法是明确输入文件、输出文件、字段规则、异常处理、依赖库、测试要求和输出格式。
4. 如何避免 AI 编造 API?
要求它只使用指定依赖,比如“只用 pandas 和标准库”。生成代码后,再通过本地运行、单元测试和官方文档确认。
5. 技术文档能不能完全交给 AI?
可以让 AI 生成 README 初稿,但字段含义、清洗规则、异常数据定义必须由项目成员确认。
总结
Gemini 3.5-flash 在 Python 数据清洗场景中很适合做“结构化助手”:先拆规则,再生成脚本草稿,再补测试用例,最后整理文档。
比较稳妥的流程是:
- 先选一个高频、低风险的数据处理任务;
- 用清晰 Prompt 约束 AI 输出;
- 让 AI 生成可 Review 的代码,而不是直接上线代码;
- 用单元测试、小样本、统计结果和人工抽样验证;
- 重要任务用多模型交叉验证,但最终判断仍由开发者负责。
把 AI 用进研发流程,关键不是让它替代开发,而是让它减少重复劳动、暴露遗漏点,并帮助团队形成更可维护的工作方式。