高级爬虫——数据清洗与处理

数据清洗是数据处理和分析过程中极其重要的一环。爬取的原始数据往往会包含噪声、不完整性、不一致性等问题,因此清洗和规范化数据是获得高质量数据集的必要步骤。本节将详细介绍 Pandas 库的基本使用 和 数据清洗的常用操作,结合代码实例,为开发者提供实用、可行的解决方案。


1. Pandas 库的基本使用

1.1 什么是 Pandas?

Pandas 是 Python 中用于数据分析和处理的高性能库,提供了丰富的工具来操作结构化数据和时间序列数据。Pandas 的核心数据结构是:

  • Series:一维数组,类似于 Python 列表或 NumPy 数组。
  • DataFrame:二维表格数据结构,类似于 Excel 表或 SQL 表。
1.2 安装 Pandas

确保 Pandas 已安装:

bash 复制代码
pip install pandas
1.3 加载与保存数据

Pandas 支持多种数据格式的读取与保存,包括 CSV、Excel、JSON、SQL 等。

  • 读取 CSV 文件:

    python 复制代码
    import pandas as pd
    data = pd.read_csv('example.csv')
    print(data.head())  # 查看前 5 行数据
  • 保存数据为 CSV 文件:

    python 复制代码
    data.to_csv('output.csv', index=False)  # index=False 不保存行号
  • 读取 Excel 文件:

    python 复制代码
    data = pd.read_excel('example.xlsx')
  • 保存数据为 Excel 文件:

    python 复制代码
    data.to_excel('output.xlsx', index=False)
1.4 DataFrame 的基本操作

以下是 Pandas DataFrame 的常见操作:

  1. 查看数据基本信息:

    python 复制代码
    print(data.info())  # 显示数据类型、缺失值等信息
    print(data.describe())  # 数值列的统计信息
  2. 选择行和列:

    python 复制代码
    # 选择列
    print(data['column_name'])
    
    # 选择多列
    print(data[['col1', 'col2']])
    
    # 选择行
    print(data.iloc[0])  # 第 1 行
    print(data.loc[2:5])  # 第 3 到第 6 行
  3. 筛选数据:

    python 复制代码
    filtered_data = data[data['column_name'] > 100]  # 筛选出列值大于 100 的行
  4. 新增或修改列:

    python 复制代码
    data['new_column'] = data['column_name'] * 2  # 添加一列,值为原列的 2 倍
  5. 删除行和列:

    python 复制代码
    data.drop('column_name', axis=1, inplace=True)  # 删除列
    data.drop([0, 1], axis=0, inplace=True)  # 删除第 1 和第 2 行

2. 数据清洗的常用操作

2.1 缺失值处理

爬取的数据经常会有缺失值(NaN)。Pandas 提供多种方法处理缺失值。

  1. 检查缺失值:

    python 复制代码
    print(data.isnull().sum())  # 每列缺失值统计
  2. 删除缺失值:

    python 复制代码
    data.dropna(inplace=True)  # 删除包含缺失值的行
  3. 填充缺失值:

    • 填充固定值:

      python 复制代码
      data['column_name'].fillna(0, inplace=True)
    • 使用列的均值、众数填充:

      python 复制代码
      data['column_name'].fillna(data['column_name'].mean(), inplace=True)
2.2 数据类型转换

Pandas 支持数据类型的转换,例如字符串转日期、浮点数转整数等。

  1. 转换数据类型:

    python 复制代码
    data['column_name'] = data['column_name'].astype(int)  # 转为整数
  2. 字符串转日期:

    python 复制代码
    data['date_column'] = pd.to_datetime(data['date_column'])
2.3 数据去重

爬取的原始数据中可能存在重复的行或字段,去重是必不可少的一步。

  1. 检查重复行:

    python 复制代码
    print(data.duplicated().sum())  # 统计重复行数
  2. 删除重复行:

    python 复制代码
    data.drop_duplicates(inplace=True)
2.4 数据格式化

将不规范的数据进行统一,例如清除多余空格、统一大小写等。

  1. 清除多余空格:

    python 复制代码
    data['column_name'] = data['column_name'].str.strip()
  2. 统一大小写:

    python 复制代码
    data['column_name'] = data['column_name'].str.lower()  # 转为小写
  3. 提取字符串中的特定信息: 使用正则表达式提取数据:

    python 复制代码
    data['extracted'] = data['column_name'].str.extract(r'(\d{4})')  # 提取年份

案例:数据清洗与处理的完整流程

以下是一个对爬取的电商数据进行清洗的案例:

原始数据示例
商品名称 价格 日期 评价数 折扣
iPhone 14 $999 2024-01-01 1.2k None
Samsung Galaxy S $899 N/A 900 10%
OnePlus 11 $599 2024-03-15 None 5%
清洗步骤
python 复制代码
import pandas as pd

# 1. 加载数据
data = pd.DataFrame({
    '商品名称': ['iPhone 14', 'Samsung Galaxy S', 'OnePlus 11'],
    '价格': ['$999', '$899', '$599'],
    '日期': ['2024-01-01', 'N/A', '2024-03-15'],
    '评价数': ['1.2k', '900', None],
    '折扣': [None, '10%', '5%']
})

# 2. 清洗价格列(去除 $ 符号并转换为浮点数)
data['价格'] = data['价格'].str.replace('$', '').astype(float)

# 3. 处理日期缺失值
data['日期'] = pd.to_datetime(data['日期'], errors='coerce')

# 4. 转换评价数为数字
data['评价数'] = data['评价数'].str.replace('k', '000').astype(float)

# 5. 填充缺失值
data['折扣'].fillna('0%', inplace=True)
data['折扣'] = data['折扣'].str.replace('%', '').astype(float)

# 6. 检查与删除重复值(如有)
data.drop_duplicates(inplace=True)

# 7. 清洗完成,展示结果
print(data)
清洗后数据
商品名称 价格 日期 评价数 折扣
iPhone 14 999.0 2024-01-01 1200.0 0.0
Samsung Galaxy S 899.0 NaT 900.0 10.0
OnePlus 11 599.0 2024-03-15 NaN 5.0

总结

数据清洗与处理是数据分析的基础,Pandas 提供了强大的工具和灵活的 API,能够应对各种复杂的数据问题。通过熟练使用 Pandas 的清洗与格式化功能,开发者可以快速高效地将原始数据转化为结构化的、分析友好的数据集。

相关推荐
用户8356290780511 分钟前
使用 Python 合并 PowerPoint 演示文稿
后端·python
xh didida3 分钟前
Linux -- 基础IO
linux·服务器·开发语言·c++
weixin_4617694015 分钟前
VS Code 中创建 Jupyter 文件(.ipynb)
ide·python·jupyter
个 人 练 习 生22 分钟前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
2601_9669496531 分钟前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
坤坤子吖34 分钟前
C++智能指针:RAII、shared_ptr与内存泄漏
开发语言·c++·笔记·学习
全栈弄潮儿40 分钟前
Python实战第1期:Python环境搭建与第一个程序
python
奋斗的阿狸_198644 分钟前
ESP32-S3 + ES7210 四通道麦克风录音上传方案
c语言·开发语言·fpga开发
心易行者1 小时前
Agent应用+API端点商业化进阶实战:从单体智能体到可付费调用的API全流程
运维·服务器·人工智能·python·apache
weixin199701080161 小时前
《1688图片空间API踩坑:img.upload 与 album.* 的防盗链与CDN缓存问题》(附Python源码)
开发语言·python·缓存