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

数据清洗是数据处理和分析过程中极其重要的一环。爬取的原始数据往往会包含噪声、不完整性、不一致性等问题,因此清洗和规范化数据是获得高质量数据集的必要步骤。本节将详细介绍 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 的清洗与格式化功能,开发者可以快速高效地将原始数据转化为结构化的、分析友好的数据集。

相关推荐
用户83562907805115 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805115 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生1 天前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师1 天前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码1 天前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf1 天前
FastAPI 如何连接 MySQL
后端·python
apocelipes2 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780512 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python