🏠 首页 攻略 用AI做数据清洗:从原始数据到可用数据集的完整流程

用AI做数据清洗:从原始数据到可用数据集的完整流程

手把手教你用AI工具完成数据清洗全流程。从数据导入、缺失值处理、异常值检测到格式统一,附Python代码示例和实操技巧。

数据清洗有多痛苦?

一个真实的数据分析项目,80%的时间花在数据清洗上。

你拿到一份客户数据,发现:

  • 有的手机号缺了最后一位
  • 日期格式五花八门:2024/01/01、Jan 1, 2024、2024.1.1
  • 城市名称有的写"北京",有的写"北京市",有的写"BJ"
  • 价格字段混入了货币符号和千分位逗号

手动处理?太慢了。用AI?效率翻倍。

今天我用一个实际案例,带你走完数据清洗的全流程。

场景设定

假设你有一份电商订单数据,约5万条记录,包含以下字段:

字段问题
order_id基本正常
customer_name有空值和重复名
phone格式不统一,有缺失
address地址信息混乱
order_date多种日期格式
amount含¥符号和千分位
status大小写不一致

目标:清洗后得到一个干净的数据集,可以直接用于分析和建模。

第一步:加载数据并初步检查

import pandas as pd
import numpy as np

# 加载数据
df = pd.read_csv('orders.csv')

# 查看基本信息
print(f"总行数: {len(df)}")
print(f"缺失值统计:\n{df.isnull().sum()}")
print(f"\n数据类型:\n{df.dtypes}")

运行后你会看到每个字段的缺失值数量。这是你的"体检报告",告诉你哪些字段需要重点处理。

第二步:处理缺失值

缺失值有三种处理方式:删除、填充、保留。

什么时候该删? 缺失率超过30%且没有合理的填充依据。

什么时候该填? 缺失率低,且有明确的填充逻辑。比如订单金额可以为0但不应该缺失。

# 查看各字段缺失比例
missing_pct = df.isnull().mean() * 100
print(missing_pct[missing_pct > 0])

# 电话缺失用"未知"填充
df['phone'] = df['phone'].fillna('未知')

# 地址缺失超过20%,直接删除这些行
if (df['address'].isnull().mean() > 0.2):
    df = df.dropna(subset=['address'])

第三步:统一格式

电话号码格式化

import re

def clean_phone(phone):
    if pd.isna(phone) or phone == '未知':
        return phone
    # 去掉所有非数字字符
    digits = re.sub(r'\D', '', str(phone))
    # 补全到11位
    if len(digits) == 11:
        return digits
    elif len(digits) == 10:
        return '1' + digits
    else:
        return phone  # 无法识别则保留原值

df['phone'] = df['phone'].apply(clean_phone)

日期格式统一

# pandas的to_datetime可以自动识别多种格式
df['order_date'] = pd.to_datetime(df['order_date'], errors='coerce')

# 检查解析失败的记录
bad_dates = df[df['order_date'].isnull()]
print(f"无法解析的日期数: {len(bad_dates)}")

# 对于解析失败的,尝试手动指定格式
for date_str in bad_dates['order_date'].dropna().unique()[:5]:
    print(repr(date_str))

errors='coerce'会把无法解析的值变成NaN,方便你后续排查。

金额字段清理

def clean_amount(amount):
    if pd.isna(amount):
        return np.nan
    # 去掉¥、$等货币符号和千分位逗号
    cleaned = re.sub(r'[¥$,]', '', str(amount))
    try:
        return float(cleaned)
    except ValueError:
        return np.nan

df['amount'] = df['amount'].apply(clean_amount)

第四步:标准化文本

城市名称统一

# 建立映射表
city_map = {
    'BJ': '北京',
    '北京': '北京',
    '北京市': '北京',
    'SH': '上海',
    '上海': '上海',
    '上海市': '上海',
    'GZ': '广州',
    '广州': '广州',
}

df['address'] = df['address'].str.extract(r'([\u4e00-\u9fa5]{2,4})')[0]

用正则提取中文部分,比逐个替换更通用。

状态字段统一

df['status'] = df['status'].str.strip().str.upper()
# 统一为中文
status_map = {
    'PENDING': '待付款',
    'PAID': '已付款',
    'SHIPPED': '已发货',
    'COMPLETED': '已完成',
    'CANCELLED': '已取消',
}
df['status'] = df['status'].map(status_map).fillna(df['status'])

第五步:去重和异常检测

去重

# 完全重复的行
duplicates = df.duplicated(keep=False).sum()
print(f"重复行数: {duplicates}")
df = df.drop_duplicates()

# 基于关键字段去重(比如订单号)
before = len(df)
df = df.drop_duplicates(subset=['order_id'])
after = len(df)
print(f"订单号重复: {before - after} 条")

异常值检测

# 检查金额的统计分布
print(df['amount'].describe())

# 找出超过3倍标准差的异常值
mean = df['amount'].mean()
std = df['amount'].std()
outliers = df[(df['amount'] > mean + 3*std) | (df['amount'] < mean - 3*std)]
print(f"异常值数量: {len(outliers)}")
print(outliers[['order_id', 'amount', 'customer_name']])

异常值不一定是错误。可能是大额订单,也可能是数据录入错误。你需要结合业务判断。

第六步:最终验证

# 确认数据质量
print("=== 最终数据质量报告 ===")
print(f"总行数: {len(df)}")
print(f"缺失值总数: {df.isnull().sum().sum()}")
print(f"重复订单号: {df['order_id'].duplicated().sum()}")
print(f"金额范围: {df['amount'].min():.2f} - {df['amount'].max():.2f}")
print(f"日期范围: {df['order_date'].min()} - {df['order_date'].max()}")

# 保存清洗后的数据
df.to_csv('orders_cleaned.csv', index=False)

AI在数据清洗中的角色

以上流程中,你可以用AI加速很多环节:

  1. 生成清洗代码 — 把数据样例发给AI,让它写出对应的清洗函数
  2. 分析异常值 — 让AI解释为什么某些记录看起来像异常
  3. 制定映射规则 — 对于复杂的字段映射,让AI帮你整理
  4. 编写验证脚本 — 清洗完成后,让AI自动生成验证代码

举个例子,你可以这样问AI:

“我有一个CSV文件,phone字段格式混乱,有的是+86-13800138000,有的是138-0013-8000,有的是13800138000。帮我写一个Python函数统一格式。”

AI会给你一段可以直接用的代码,你只需要微调就能跑通。

常见坑

  1. 不要盲目删除缺失值 — 先分析缺失模式,是随机缺失还是有规律的
  2. 备份原始数据 — 清洗是不可逆操作,永远保留一份原始副本
  3. 逐步验证 — 每清洗一个字段就检查一次,不要等全部洗完再看
  4. 关注边界情况 — 空字符串、全空格、特殊字符都可能被忽略

总结

数据清洗的核心思路就是五个字:查、补、洗、验、存

  • 查:了解数据长什么样
  • 补:处理缺失值
  • 洗:统一格式、标准化
  • 验:去重、异常检测
  • 存:保存结果、记录过程

AI不是魔法,它不能替你理解业务。但它能帮你把重复性的工作自动化,让你把精力放在真正重要的决策上。

下次拿到脏数据,别慌。按这个流程走一遍,干净的数据就在眼前。

你清洗数据时遇到过最奇葩的问题是什么?评论区分享一下吧。