爬完数据就完了?用 Pandas 做数据清洗与预处理
不少人用爬虫获取数据后,就觉得 “数据到手,分析无忧”,但打开数据表才发现 —— 空值占了半列、重复数据堆成山、日期是 “字符串” 格式、数值里混着特殊符号…… 这些 “脏数据” 会直接导致后续分析结果失真,甚至让整个项目白费功夫。而 Pandas,正是 Python 中解决数据清洗与预处理的核心工具,能帮我们把 “乱糟糟” 的数据变成 “可用、可靠” 的分析素材。
一、先搞懂:为什么必须做数据清洗与预处理?
爬取的原始数据,本质是 “未经筛选的原始素材”,存在大量影响分析的问题。不做清洗直接用,会带来两大风险:
- 分析结果失真:比如用含大量空值的 “用户消费数据” 计算平均值,结果会远低于真实水平;用重复数据统计 “用户数量”,会导致用户规模虚高。
- 后续操作报错:比如把字符串格式的 “日期” 传入时间序列分析模型,会直接触发类型错误;异常值(如 “年龄 = 200 岁”)会让机器学习模型训练偏离方向。
简单说:数据清洗是 “排除错误”,预处理是 “优化格式”,两者共同决定了数据分析的基础质量。
二、Pandas 数据清洗:搞定 3 类核心问题
Pandas 提供了简洁的 API,能高效解决原始数据中最常见的 “缺失值、重复值、异常值” 问题,以下是实操步骤:
1. 缺失值处理:补全或删除,避免数据浪费
首先要定位缺失值,再根据业务场景选择处理方式:
- 第一步:检测缺失值用
isnull().sum()统计每列缺失值数量,用info()查看数据整体非空情况,快速判断缺失严重程度。示例代码:python
运行
import pandas as pd df = pd.read_csv("爬取的数据.csv") # 读取数据 print(df.isnull().sum()) # 输出每列缺失值个数 print(df.info()) # 查看数据类型与非空数 - 第二步:处理缺失值
- 缺失少(占比 <5%):数值型数据用 “均值 / 中位数” 填充(
df['列名'].fillna(df['列名'].mean(), inplace=True)),分类数据用 “众数” 填充(df['列名'].fillna(df['列名'].mode()[0], inplace=True))。 - 缺失多(占比 > 30%):直接删除该列(
df.drop('列名', axis=1, inplace=True)),避免填充带来的误差。
- 缺失少(占比 <5%):数值型数据用 “均值 / 中位数” 填充(
2. 重复值处理:去重后再分析,避免数据冗余
重复数据会导致统计结果重复计算(比如同一用户被多次计入 “活跃用户数”),处理步骤如下:
- 第一步:检测重复值用
duplicated().sum()统计重复行数量,用df[df.duplicated()]查看具体重复内容。示例代码:python
运行
print(df.duplicated().sum()) # 输出重复行总数 print(df[df.duplicated()]) # 查看所有重复行 - 第二步:删除重复值用
drop_duplicates(inplace=True)直接删除重复行,默认保留第一行;若需根据指定列判断重复(如 “用户 ID”),可加参数subset=['用户ID']。示例代码:python
运行
df.drop_duplicates(subset=['用户ID'], inplace=True) # 按用户ID去重
3. 异常值处理:识别 “离谱数据”,减少干扰
异常值是指明显偏离正常范围的数据(如 “工资 = 100 元 / 月”“身高 = 3 米”),处理步骤如下:
- 第一步:检测异常值用
describe()查看数值型数据的 “均值、标准差、最值”,若最值明显超出合理范围(如 “年龄最大值 = 200”),则可能存在异常值;也可用箱线图可视化(df['列名'].boxplot()),图中 “圆点” 即为异常值。示例代码:python
运行
print(df['年龄'].describe()) # 查看年龄的统计信息 df['年龄'].boxplot() # 绘制年龄箱线图 - 第二步:处理异常值常用 “四分位距(IQR)法” 筛选正常数据范围,超出范围的视为异常值并删除。示例代码(处理年龄异常值):
python
运行
Q1 = df['年龄'].quantile(0.25) # 第一四分位数 Q3 = df['年龄'].quantile(0.75) # 第三四分位数 IQR = Q3 - Q1 # 四分位距 # 保留在 [Q1-1.5*IQR, Q3+1.5*IQR] 范围内的数据 df = df[(df['年龄'] >= Q1 - 1.5*IQR) & (df['年龄'] <= Q3 + 1.5*IQR)]
三、Pandas 数据预处理:让数据 “适配” 分析需求
清洗完 “错误数据” 后,还需通过预处理让数据格式、量级适配后续分析(如建模、可视化),核心操作有两类:
1. 数据类型转换:让数据 “归位”
爬取的数据常出现 “类型错配”—— 比如日期是字符串(object类型)、数值是文本(如 “100 元”),需转换为正确类型:
- 日期类型转换:用
to_datetime()将字符串日期转为datetime类型,方便后续时间序列分析。示例代码:python
运行
df['日期'] = pd.to_datetime(df['日期']) # 字符串转日期 - 数值类型转换:先清理数值中的非数字字符(如 “100 元”→“100”),再用
astype()转为int/float类型。示例代码:python
运行
df['金额'] = df['金额'].str.replace('元', '').astype(float) # 清理字符并转数值
2. 数据标准化 / 归一化:消除量级影响
若数据量级差异大(如 “用户年龄:0-100”“用户消费:0-10000”),会影响聚类、回归等模型的结果,需通过标准化 / 归一化统一量级:
- 标准化(Z-Score):将数据转为 “均值 = 0,标准差 = 1” 的分布,适合正态分布数据。示例代码:
python
运行
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() df['消费_标准化'] = scaler.fit_transform(df[['消费']]) - 归一化(Min-Max):将数据压缩到 “0-1” 区间,适合非正态分布数据。示例代码:
python
运行
from sklearn.preprocessing import MinMaxScaler min_max_scaler = MinMaxScaler() df['消费_归一化'] = min_max_scaler.fit_transform(df[['消费']])
四、总结:数据清洗与预处理,是分析的 “地基”
爬取数据只是第一步,真正的数据分析从 “清洗与预处理” 开始 —— 没有干净、规范的数据,再复杂的分析模型也只是 “空中楼阁”。而 Pandas 凭借简洁的 API,能帮我们高效解决缺失值、重复值、异常值等问题,让数据从 “能用” 变成 “好用”。
建议大家养成习惯:爬取数据后,先跑一遍 “缺失值→重复值→异常值→类型转换” 的流程,再进入后续的可视化或建模环节,这样才能保证分析结果的可靠性。
