本文目录导读:

数据清洗是数据分析中非常关键的一步,尤其是处理从网页、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抠出来,还是从各种接口拉回来的杂乱数据,都能有条不紊地处理干净。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播