用Pandas清洗爬虫数据:缺失值处理技巧全解析

简介: 爬虫数据常含缺失值,如同带泥土豆。本文用Python+Pandas演示清洗全流程:识别显性、隐性、结构缺失,结合删除、填充、模型预测等方法,将脏数据变“净数据”,助力精准分析。附实战代码与避坑指南。

免费编程软件「python+pycharm」
链接:https://pan.quark.cn/s/48a86be2fdc0

爬虫抓取的数据就像刚从泥坑里挖出来的土豆,表面沾满泥土(缺失值、重复值、异常值),内部可能还有坏掉的部分(无效数据)。本文聚焦最让人头疼的缺失值问题,用Python的Pandas库演示如何像处理食材一样清洗数据,让脏数据变成可直接分析的"净数据"。
探秘代理IP并发连接数限制的那点事 - 2025-10-28T161216.387.png

一、缺失值的三种形态
爬虫数据中的缺失值通常以三种形式存在:

显性缺失:直接显示为None或NaN(Not a Number)
隐性缺失:用特殊值代替(如"-"、"N/A"、"0")
结构缺失:整行/整列数据缺失(如JSON解析失败导致的空字典)
import pandas as pd
import numpy as np

模拟爬虫数据

data = {
'商品名称': ['iPhone13', '华为Mate50', None, '小米13', 'N/A'],
'价格': [5999, 4999, np.nan, 3999, '-'],
'销量': [1200, 800, 0, 1500, None],
'库存': ['有货', '缺货', '有货', '有货', '']
}
df = pd.DataFrame(data)

二、缺失值检测四步法

  1. 快速概览缺失情况

    查看每列缺失值数量

    print(df.isnull().sum())

查看缺失值比例

print(df.isnull().mean().round(2))

输出结果会显示每列有多少缺失值及其占比,帮助判断哪些字段需要重点处理。

  1. 可视化缺失分布
    import missingno as msno

msno.matrix(df.sample(5)) # 随机展示5行数据的缺失矩阵
msno.bar(df) # 柱状图展示各列缺失比例

  1. 识别隐性缺失

    自定义隐性缺失值列表

    hidden_missing = ['-', 'N/A', '无', '未知', '']

检测包含隐性缺失的列

for col in df.columns:
if df[col].dtype in ['object', 'string']:
missing_count = df[col].isin(hidden_missing).sum()
if missing_count > 0:
print(f"{col}列发现{missing_count}个隐性缺失值")

  1. 结构缺失检测

    检查是否有整行为空的情况

    print("整行为空的记录数:", df.isnull().all(axis=1).sum())

检查特定列组合缺失模式

print(df[['价格', '销量']].isnull().sum())

三、缺失值处理实战方案
方案1:直接删除(适用于缺失率<30%的列)

删除包含缺失值的行(谨慎使用)

df_drop_rows = df.dropna()

删除缺失值超过50%的列

threshold = len(df) * 0.5
df_drop_cols = df.dropna(thresh=threshold, axis=1)

指定列删除(当价格缺失时删除整行)

df_drop_specific = df.dropna(subset=['价格'])

方案2:填充固定值(适用于分类数据)

用"未知"填充商品名称缺失

df['商品名称'] = df['商品名称'].fillna('未知')

用0填充销量缺失(需确认业务逻辑)

df['销量'] = df['销量'].fillna(0)

批量处理文本列的隐性缺失

text_cols = ['商品名称', '库存']
for col in text_cols:
df[col] = df[col].replace(hidden_missing, '未知')

方案3:统计量填充(适用于数值数据)

用中位数填充价格(抗异常值干扰)

median_price = df['价格'].median()
df['价格'] = df['价格'].replace('-', np.nan).fillna(median_price)

用均值填充销量(需数据分布均匀)

mean_sales = df['销量'].mean()
df['销量'] = df['销量'].fillna(mean_sales)

前向填充(时间序列数据适用)

df['价格'] = df['价格'].fillna(method='ffill')

方案4:模型预测填充(适用于关键字段)
from sklearn.ensemble import RandomForestRegressor

准备数据(示例:用其他特征预测价格)

known = df[df['价格'].notna()]
unknown = df[df['价格'].isna()]

X_known = known[['销量', '库存']]
y_known = known['价格']
X_unknown = unknown[['销量', '库存']]

训练模型并预测

model = RandomForestRegressor(n_estimators=100)
model.fit(X_known, y_known)
predicted_prices = model.predict(X_unknown)

填充缺失值

df.loc[df['价格'].isna(), '价格'] = predicted_prices

方案5:插值法(适用于有序数据)

创建带时间索引的示例数据

dates = pd.date_range('2023-01-01', periods=5)
temp_data = {'温度': [22, np.nan, 25, np.nan, 28]}
temp_df = pd.DataFrame(temp_data, index=dates)

线性插值

temp_df['温度'] = temp_df['温度'].interpolate()

时间加权插值(更平滑)

temp_df['温度'] = temp_df['温度'].interpolate(method='time')

四、缺失值处理进阶技巧

  1. 分组填充(不同类别不同策略)

    按库存状态分组填充价格

    def fill_price(group):
    if group.name == '有货':
     return group.fillna(group.median())
    
    else:
     return group.fillna(0)  # 缺货商品可能标0价
    

df['价格'] = df.groupby('库存')['价格'].apply(fill_price)

  1. 多重填充策略组合

    先填充隐性缺失,再填充显性缺失

    for col in ['价格', '销量']:

    处理隐性缺失

    if df[col].dtype == 'object':

     df[col] = df[col].replace('-', np.nan)
    

    根据缺失率选择填充方式

    missing_rate = df[col].isna().mean()
    if missing_rate < 0.1:

     df[col] = df[col].fillna(df[col].median())
    

    elif missing_rate < 0.3:

     df[col] = df[col].fillna(df[col].mean())
    

    else:

     df[col] = df[col].fillna(-1)  # 标记特殊值
    
  2. 缺失值标记法(保留信息)

    创建缺失标记列

    for col in ['价格', '销量']:
    df[f'{col}_is_missing'] = df[col].isna().astype(int)

然后填充缺失值

df['价格'] = df['价格'].fillna(df['价格'].median())

五、处理后的数据验证

验证缺失值是否处理完成

print("剩余缺失值数量:\n", df.isnull().sum())

检查填充值是否合理

print("价格描述统计:\n", df['价格'].describe())
print("销量分布:\n", df['销量'].value_counts())

可视化验证

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
df['价格'].plot(kind='hist', title='价格分布')
plt.subplot(1, 2, 2)
df['销量'].plot(kind='hist', title='销量分布')
plt.tight_layout()
plt.show()

常见问题Q&A
Q1:被网站封IP怎么办?
A:立即启用备用代理池,建议使用住宅代理(如站大爷IP代理),配合每请求更换IP策略。更稳妥的方式是使用爬虫框架(如Scrapy)的中间件实现自动切换。

Q2:如何选择填充值?
A:根据数据类型和业务逻辑决定:

数值型:中位数(抗异常值)> 均值(数据分布均匀时)> 固定值
类别型:众数 > "未知" > 新类别
时间序列:插值法 > 前向填充 > 固定值
Q3:缺失值处理会影响数据分析结果吗?
A:会。不当处理可能导致:

均值/方差计算偏差
模型过拟合(如用均值填充造成虚假集中趋势)
分类模型准确率下降(错误填充改变数据分布)
Q4:什么时候应该删除缺失值?
A:满足以下条件时考虑删除:

缺失率超过70%的列
关键字段缺失的记录(如订单ID缺失)
缺失机制完全随机(MCAR)且样本量充足
Q5:如何自动化缺失值处理流程?
A:可创建处理管道:

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

def preprocess_data(df):
numeric_features = ['价格', '销量']
categorical_features = ['商品名称', '库存']

numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median'))
])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='未知'))
])

# 实际应用中可使用ColumnTransformer组合处理
# 此处仅为示例结构
return processed_df

结语
处理缺失值就像修理一辆二手车:不是简单更换损坏零件,而是要理解每个缺失背后的原因。有时缺失本身就包含信息(如用户未填写收入可能暗示低收入群体),过度填充反而会丢失价值。建议每次处理后都保存处理日志,记录缺失率、填充策略和验证结果,为后续分析提供可追溯的依据。

目录
相关文章
|
13天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
5天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
12天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
8天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
776 23
|
7天前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
497 37
|
7天前
|
机器学习/深度学习 人工智能 搜索推荐
万字长文深度解析最新Deep Research技术:前沿架构、核心技术与未来展望
近期发生了什么自 2025 年 2 月 OpenAI 正式发布Deep Research以来,深度研究/深度搜索(Deep Research / Deep Search)正在成为信息检索与知识工作的全新范式:系统以多步推理驱动大规模联网检索、跨源证据。
483 41
|
1天前
|
文字识别 监控 物联网
这是我写的实施一地两检的跨境高铁站旅客资料预报系统的系统架构
本文设计了一套基于IAPIS理念的高铁跨境旅客预报与边检联动系统,覆盖青青草原内地与喜羊羊特别行政区间“一地两检”场景。系统在旅客购票后即采集证件、生物特征及行程信息,通过Advance Passenger Info Checker等模块,向出发地和目的地移民管理机构实时推送数据,实现出入境许可预审。支持线上/线下购票、检票、退票全流程管控,结合面部识别、行为追踪技术监控旅客状态,防止滞留或非法通行。列车发车前进行最终核验,确保所有跨境旅客获边检许可。若旅行被中途取消,系统自动改签、退票并通知各方,保障安全与效率。(239字)