如何使用 Pandas 进行数据清洗?如何保证数据清洗的效果?

大数据 数据分析
考虑使用自动化工具和框架来简化数据清洗过程。例如,使用 Apache Airflow 或 Prefect 来自动化数据管道,确保数据清洗步骤的一致性和可重复性。

前言

数据清洗是数据分析和机器学习项目中的关键步骤,它涉及处理缺失值、异常值、重复记录、不一致的数据等。Pandas 提供了丰富的功能来帮助你进行数据清洗。

如何使用 Pandas 进行数据清洗

1. 导入必要的库

import pandas as pd
import numpy as np

2. 读取数据

假设你有一个 CSV 文件 data.csv,其中包含一些特征和目标变量。

# 读取数据
df = pd.read_csv('data.csv')
print(df.head())

3. 数据探索

了解数据的基本信息,包括缺失值、数据类型等。

# 查看基本信息
print(df.info())
# 查看描述性统计信息
print(df.describe())
# 检查缺失值
print(df.isnull().sum())

4. 处理缺失值

删除含有缺失值的行或列

# 删除含有缺失值的行
df = df.dropna()
# 删除含有缺失值的列
df = df.dropna(axis=1)
填充缺失值
# 用均值填充数值列的缺失值
df['Age'] = df['Age'].fillna(df['Age'].mean())
# 用众数填充分类列的缺失值
df['Gender'] = df['Gender'].fillna(df['Gender'].mode()[0])
# 用特定值填充
df['Income'] = df['Income'].fillna(0)
# 使用前一个值填充
df['Salary'] = df['Salary'].fillna(method='ffill')
# 使用后一个值填充
df['Salary'] = df['Salary'].fillna(method='bfill')
# 使用插值方法填充
df['Temperature'] = df['Temperature'].interpolate()

5. 处理异常值

条件筛选

# 移除年龄大于100岁的记录
df = df[df['Age'] <= 100]
使用 Z-score 方法
from scipy import stats
# 计算 Z-score
z_scores = np.abs(stats.zscore(df.select_dtypes(include=[np.number])))
# 移除 Z-score 大于 3 的记录
df = df[(z_scores < 3).all(axis=1)]
使用 IQR 方法
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
# 移除 IQR 范围外的记录
df = df[~((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).any(axis=1)]

6. 处理重复记录

# 检查并删除重复记录
df = df.drop_duplicates()

7. 数据类型转换

确保每个列的数据类型正确。

# 将字符串转换为日期
df['Date'] = pd.to_datetime(df['Date'])
# 将对象类型转换为数值类型
df['Age'] = pd.to_numeric(df['Age'], errors='coerce')
# 将数值类型转换为类别类型
df['Category'] = df['Category'].astype('category')

8. 处理不一致的数据

确保数据的一致性,例如统一文本格式。

统一文本格式

# 将所有文本转换为小写
df['Name'] = df['Name'].str.lower()
# 去除空格
df['Name'] = df['Name'].str.strip()
替换特定值
# 替换特定值
df['City'] = df['City'].replace({'New York City': 'New York', 'LA': 'Los Angeles'})

9. 处理特殊字符

去除不必要的特殊字符。

# 去除特殊字符
df['Comment'] = df['Comment'].str.replace('[^\w\s]', '', regex=True)

10. 处理时间序列数据

处理时间序列数据,如提取年份、月份、日等。

# 提取年份、月份、日
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day

11. 保存清洗后的数据

将清洗后的数据保存到新的文件中。

# 保存清洗后的数据
df.to_csv('cleaned_data.csv', index=False)

如何保证数据清洗的效果?

1. 定义清晰的数据质量标准

在开始数据清洗之前,明确你的数据质量标准。这包括:

数据的完整性:确保所有必要的字段都已填写。

数据的一致性:确保数据在不同记录之间是一致的。

数据的准确性:确保数据反映了真实情况。

数据的有效性:确保数据符合预期的格式和范围。


2. 进行彻底的数据探索

在清洗数据之前,进行彻底的数据探索以了解数据的基本情况。使用 Pandas 和其他可视化工具来检查数据的分布、缺失值、异常值等。

# 查看基本信息
print(df.info())
# 查看描述性统计信息
print(df.describe())
# 检查缺失值
print(df.isnull().sum())
# 可视化数据分布
import matplotlib.pyplot as plt
df['Age'].hist(bins=20)
plt.show()

3. 记录每一步操作

记录你在数据清洗过程中所做的每一步操作。这有助于你跟踪和验证每个步骤的效果,并在需要时回溯或调整。

# 记录每一步操作
with open('data_cleaning_log.txt', 'w') as f:
    f.write("Data Cleaning Log:\n")
    f.write(f"Initial shape: {df.shape}\n")
    # 示例:处理缺失值
    df = df.dropna()
    f.write(f"After dropping missing values: {df.shape}\n")
    # 示例:处理异常值
    df = df[df['Age'] <= 100]
    f.write(f"After removing outliers: {df.shape}\n")
    # 其他步骤...

4. 分阶段进行数据清洗

将数据清洗过程分为多个阶段,逐步进行并验证每个阶段的效果。这样可以更容易地发现和解决问题。

# 第一阶段:处理缺失值
df = df.dropna()
# 验证结果
print(df.isnull().sum())
# 第二阶段:处理异常值
df = df[df['Age'] <= 100]
# 验证结果
print(df['Age'].describe())

5. 使用断言和测试

编写断言和测试来验证数据清洗的结果是否符合预期。这可以通过简单的条件语句或更复杂的单元测试来实现。

# 断言
assert df.isnull().sum().sum() == 0, "There are still missing values in the dataset"
assert (df['Age'] > 100).sum() == 0, "There are still age values greater than 100"
# 单元测试
import unittest
class TestDataCleaning(unittest.TestCase):
    def test_missing_values(self):
        self.assertEqual(df.isnull().sum().sum(), 0)
    def test_outliers(self):
        self.assertEqual((df['Age'] > 100).sum(), 0)
if __name__ == '__main__':
    unittest.main(argv=['first-arg-is-ignored'], exit=False)

6. 定期复查数据

即使数据清洗完成后,也要定期复查数据,确保没有新的问题出现。特别是在数据源发生变化或有新数据加入时。

# 定期复查数据
def check_data_quality(df):
    print("Checking data quality...")
    print("Missing values:", df.isnull().sum())
    print("Outliers in Age:", (df['Age'] > 100).sum())
check_data_quality(df)

7. 使用版本控制

使用版本控制系统(如 Git)来管理数据和代码。这样可以在出现问题时轻松回滚到之前的版本。

# 初始化 Git 仓库
git init
# 添加文件
git add data_cleaning_script.py
git add data_cleaning_log.txt
# 提交更改
git commit -m "Initial data cleaning script and log"

8. 与团队成员沟通

如果你在一个团队中工作,确保与团队成员沟通数据清洗的过程和结果。共享文档、日志和测试结果,以便其他人可以理解和验证你的工作。

9. 使用自动化工具

考虑使用自动化工具和框架来简化数据清洗过程。例如,使用 Apache Airflow 或 Prefect 来自动化数据管道,确保数据清洗步骤的一致性和可重复性。

10. 监控数据质量

建立数据质量监控系统,定期检查数据的质量指标。这可以通过设置报警或报告来实现,以便及时发现和解决问题。

责任编辑:武晓燕 来源: 测试开发学习交流
相关推荐

2023-09-26 01:03:36

Pandas数据数据集

2023-05-05 19:16:22

Python数据清洗

2022-03-28 14:08:02

Python数据清洗数据集

2018-04-03 12:07:53

数据清洗PandasNumpy

2023-05-05 19:29:41

2020-07-10 09:49:53

数据清理数据分析查找异常

2024-01-29 18:06:39

SQL数据格式

2021-07-27 15:40:39

Python数据清洗函数

2021-05-07 09:39:54

数据清洗方式

2021-08-25 07:47:53

Pandas函数数据处理

2022-04-28 18:47:04

Pandas函数Python

2013-03-20 15:49:28

大数据

2023-08-15 16:20:42

Pandas数据分析

2022-11-02 14:45:24

Python数据分析工具

2013-03-20 16:23:53

数据清洗

2023-02-15 08:24:12

数据分析数据可视化

2023-10-18 18:38:44

数据校验业务

2019-09-27 12:44:03

数据建模企业数据存储

2023-09-27 15:34:48

数据编程

2017-09-26 19:02:09

PythonInstagram数据分析
点赞
收藏

51CTO技术栈公众号