本文目录导读:

数据清洗是数据分析中非常关键的一步,尤其是处理从网页、API或文档中抓取下来的“杂乱数据”,杂乱数据通常包括:缺失值、重复值、格式不一致、异常字符、无效空格、HTML标签、乱码等。
以下是使用电脑工具(主要以Excel、Python Pandas、以及一些常用的数据清洗函数) 进行数据清洗的实战流程和方法。
第一阶段:初步审查与概览
在清洗之前,先了解数据有多“脏”。
- 查看数据维度:多少行、多少列。
- 查看数据类型:数字被存成了文本?日期变成了字符串?
- 查看缺失值:哪些列有空值?占比多少?
- 查看重复值:是否存在完全重复的行?
工具操作:
- Excel:选中数据区域,按
Ctrl + T创建表格,然后使用“排序和筛选”或“条件格式”来标记重复值。 - Python:
import pandas as pd df = pd.read_csv('your_data.csv') # 或 pd.read_excel() print(df.info()) # 查看列名、非空数、数据类型 print(df.describe()) # 查看数值列的统计信息 print(df.isnull().sum()) # 每列缺失值数量 print(df.duplicated().sum()) # 重复行数量
第二阶段:核心清洗步骤(按顺序进行)
处理缺失值
- 直接删除:如果某一行缺失值过多,或该列缺失值占比超过70%,直接删除。
- Excel:定位到空值 -> 删除行。
- Python:
df.dropna(subset=['关键列'], inplace=True)或df.dropna(thresh=len(df.columns)*0.6, inplace=True)。
- 填充:用均值、中位数、众数或特定字符填充。
- Excel:
=IF(ISBLANK(A2), "未知", A2)或查找替换空值。 - Python:
df['年龄'].fillna(df['年龄'].median(), inplace=True)。
- Excel:
处理重复值
- 识别:根据“所有列”或“特定列”判断是否重复。
- 操作:保留第一次出现的,删除后续重复。
- Excel:数据 -> 删除重复值。
- Python:
df.drop_duplicates(subset=['姓名', '手机号'], keep='first', inplace=True)。
处理格式与文本混乱(最常遇到的抓取数据问题)
这是清洗的重点,常见问题包括:
A. 清除不可见字符和空格
- 问题:数据前后有
\n,\t,\r或全角空格。 - Excel:使用
=TRIM(A1)去除首尾空格,=CLEAN(A1)去除非打印字符。 - Python:
# 去除所有列的字符串空格和换行 df['列名'] = df['列名'].str.strip().str.replace('\n', '').str.replace('\t', '').str.replace('\r', '')
B. 处理大小写与标准格式
- 问题:
Beijing和BEIJING被认为是不同的。 - Python:
df['城市'] = df['城市'].str.title()(首字母大写)或str.upper()。
C. 处理特殊符号与HTML标签
- 问题:从网页抓取的数据带有
<br>,<p>,&等。 - Python(推荐使用
BeautifulSoup或re模块):import re df['文本'] = df['文本'].apply(lambda x: re.sub(r'<[^>]+>', '', str(x))) # 删除所有HTML标签 df['文本'] = df['文本'].str.replace('&', '&').replace(' ', ' ')
D. 处理不可见字符与乱码
- 问题:抓取数据时由于编码问题出现
çæ±或\u200b。 - Python:
df['列'] = df['列'].str.encode('ascii', 'ignore').str.decode('ascii') # 强制忽略非ASCII字符 # 或者手动替换常见的Unicode控制字符 df['列'] = df['列'].str.replace(r'[\u200b\u200c\u200d\ufeff]', '', regex=True)
E. 拆分与合并列
- 问题:抓取时把“姓名-手机号”放在了一个单元格里。
- Excel:数据 -> 分列(按分隔符或固定宽度)。
- Python:
df[['姓名', '手机号']] = df['原始列'].str.split('-', expand=True)
处理数据类型异常
- 问题:数字列里混入了“,”或“元”等中文,导致Excel无法求和。
- Excel:选中列 -> 查找替换(将“,”替换为空,将“元”替换为空) -> 然后设置单元格格式为“数值”。
- Python:
# 移除非数字字符并转为数值 df['销售额'] = df['销售额'].str.replace('元', '').str.replace(',', '') df['销售额'] = pd.to_numeric(df['销售额'], errors='coerce') # coerce会将转换失败的设为NaN
处理日期格式
- 问题:
2023/1/1,2023年1月1日,01-01-2023混在一起。 - Excel:选中列 -> 数据 -> 分列 -> 日期格式(YMD)。
- Python:
# 统一解析成标准日期格式 df['日期'] = pd.to_datetime(df['日期'], errors='coerce', format='mixed') df['日期'] = df['日期'].dt.strftime('%Y-%m-%d') # 转为字符串标准格式
第三阶段:高级清洗技巧
基于规则的异常值清洗
- 规则:年龄大于150,价格小于0,手机号不是11位。
- Python:
# 将不合逻辑的年龄设为NaN df['年龄'] = df['年龄'].apply(lambda x: x if 0 < x < 120 else None) # 过滤掉价格小于0的行 df = df[df['价格'] >= 0]
近似匹配与模糊清洗
- 问题:
“北京”与“北京市”需要统一。 - Python:先标准化,如
df['城市'] = df['城市'].str.replace('市', '')。
实战案例:清洗一段抓取的商品数据
原始杂乱数据示例:
| 商品名 | 价格 | 销量 | 详情 |
|---|---|---|---|
| iPhone15,蓝色 | 6,999.00元 | 1,234件 | <p>全新正品</p> |
| 华为 Mate60 | 00 元 | 567 件 | \n 鸿蒙系统\n |
| 无 | N/A | null |
|
| 小米14 白色 | 00元 | 2,345件 | 徕卡镜头 |
Python 完整清洗脚本:
import pandas as pd
import re
# 1. 读取数据
df = pd.read_csv('商品数据.csv', encoding='utf-8')
# 2. 删除空行(商品名为空)
df.dropna(subset=['商品名'], inplace=True)
# 3. 处理重复(基于商品名和价格)
df.drop_duplicates(subset=['商品名', '价格'], inplace=True)
# 4. 清洗价格:去掉“元”,去掉逗号,转为数字
df['价格'] = df['价格'].astype(str).str.replace('元', '').str.replace(',', '').str.strip()
df['价格'] = pd.to_numeric(df['价格'], errors='coerce')
# 5. 清洗销量:去掉“件”,去掉空格,转为数字
df['销量'] = df['销量'].astype(str).str.replace('件', '').str.strip()
# 处理 'N/A' 或 '无'
df['销量'] = df['销量'].replace(['N/A', '无', 'null'], None)
df['销量'] = pd.to_numeric(df['销量'], errors='coerce')
# 6. 清洗详情:去除HTML标签、去除换行符、去除null字符串
def clean_text(text):
if pd.isna(text) or text == 'null':
return ''
text = re.sub(r'<[^>]+>', '', str(text)) # 去HTML
text = text.replace('\n', '').replace('\r', '').strip()
return text
df['详情'] = df['详情'].apply(clean_text)
# 7. 重置索引
df = df.reset_index(drop=True)
# 8. 保存清洗后的数据
df.to_csv('商品数据_清洗后.csv', index=False, encoding='utf-8-sig')
print("清洗完成!")
清洗原则
- 先备份:在清洗前,永远保留一份原始数据副本,不要直接在源文件上改。
- 分步进行:不要试图一次性完成所有清洗,先处理缺失,再处理重复,再处理格式。
- 记录日志:使用Python脚本时,可以打印出“删除了多少行重复”、“填补了多少空值”,方便复盘。
- 追求一致:清洗的目标不是“完美”,而是“一致”,无论你统一用
“北京”还是“北京市”,只要统一就行。
掌握了上述方法,无论是从网页抓下来、从PDF抠出来,还是从各种接口拉回来的杂乱数据,都能有条不紊地处理干净。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。