基于Python的数据清洗与预处理:技术实践指南

03-18 78阅读
󦘖

免费快速起号(微信号)

yycoo88

添加微信

在数据分析和机器学习领域,数据清洗和预处理是至关重要的步骤。无论是从互联网爬取的数据、企业内部的数据库,还是公开数据集,原始数据往往存在缺失值、异常值、格式不一致等问题。这些问题如果不加以处理,将严重影响后续分析或建模的准确性。本文将详细介绍如何使用Python进行数据清洗与预处理,并通过代码示例展示具体操作。


数据清洗的重要性

数据清洗是指对原始数据进行检查、清理和转换,以确保数据的质量和一致性。以下是一些常见的数据问题及其影响:

缺失值:可能导致模型训练时出现错误或偏差。重复数据:增加计算负担并可能引入冗余信息。异常值:可能扭曲统计结果或模型预测。格式不一致:例如日期格式不同(YYYY-MM-DD vs MM/DD/YYYY),会导致解析错误。类型错误:如数值型数据被误标记为字符串。

为了应对这些问题,我们需要掌握一系列数据清洗技巧。接下来,我们将通过一个实际案例来演示这些技术。


环境搭建与数据准备

1. 安装必要的库

我们主要依赖以下Python库来进行数据清洗和预处理:

pandas:用于数据操作和分析。numpy:提供高效的数值计算功能。matplotlibseaborn:用于可视化数据分布。sklearn:用于标准化、归一化等高级预处理。

安装命令如下:

pip install pandas numpy matplotlib seaborn scikit-learn

2. 数据集介绍

假设我们有一个关于房价的数据集,包含以下字段:

Price:房屋价格。Area:房屋面积。Bedrooms:卧室数量。Age:房屋年龄。Location:地理位置。

以下是部分数据样本:

PriceAreaBedroomsAgeLocation
50080210City A
NaN10035City B
700NaN415City C

可以看到,数据中存在缺失值和潜在的异常值。


数据清洗步骤

1. 导入数据

首先,我们将数据导入到Pandas DataFrame中。

import pandas as pd# 创建示例数据data = {    'Price': [500, None, 700],    'Area': [80, 100, None],    'Bedrooms': [2, 3, 4],    'Age': [10, 5, 15],    'Location': ['City A', 'City B', 'City C']}df = pd.DataFrame(data)print("原始数据:")print(df)

输出结果:

原始数据:   Price  Area  Bedrooms  Age Location0  500.0   80         2   10   City A1    NaN  100         3    5   City B2  700.0   NaN        4   15   City C

2. 处理缺失值

方法1:删除含有缺失值的行

如果缺失值较少且不影响整体分析,可以直接删除相关行。

# 删除含有缺失值的行df_cleaned = df.dropna()print("\n删除缺失值后的数据:")print(df_cleaned)

输出结果:

删除缺失值后的数据:   Price  Area  Bedrooms  Age Location0  500.0   80         2   10   City A

方法2:填充缺失值

对于某些关键字段,可以采用均值、中位数或特定值进行填充。

# 使用均值填充缺失值mean_price = df['Price'].mean()mean_area = df['Area'].mean()df_filled = df.fillna({'Price': mean_price, 'Area': mean_area})print("\n填充缺失值后的数据:")print(df_filled)

输出结果:

填充缺失值后的数据:     Price  Area  Bedrooms  Age Location0  500.000  80.0         2   10   City A1  600.000 100.0         3    5   City B2  700.000  90.0         4   15   City C

3. 检测并处理异常值

异常值可能是由于测量错误或极端情况引起的。我们可以通过箱线图或Z分数法检测异常值。

方法1:基于箱线图检测

import matplotlib.pyplot as plt# 绘制箱线图plt.figure(figsize=(8, 4))plt.boxplot(df_filled['Price'])plt.title('Boxplot of Price')plt.show()

方法2:基于Z分数检测

Z分数表示某个值距离平均值的标准差数。通常认为Z分数大于3的点为异常值。

from scipy import statsz_scores = stats.zscore(df_filled[['Price', 'Area']])abs_z_scores = abs(z_scores)# 筛选出Z分数小于3的数据filtered_entries = (abs_z_scores < 3).all(axis=1)df_no_outliers = df_filled[filtered_entries]print("\n去除异常值后的数据:")print(df_no_outliers)

4. 数据类型转换

有时数据的类型不符合预期,例如数字被识别为字符串。我们可以使用astype()方法进行转换。

# 将Price和Area转换为整数df_converted = df_no_outliers.copy()df_converted['Price'] = df_converted['Price'].astype(int)df_converted['Area'] = df_converted['Area'].astype(int)print("\n数据类型转换后的数据:")print(df_converted.dtypes)

输出结果:

数据类型转换后的数据:Price        int32Area         int32Bedrooms     int64Age          int64Location    objectdtype: object

5. 标准化与归一化

在机器学习建模前,通常需要对数值型特征进行标准化或归一化处理。

方法1:标准化(Z-score)

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()scaled_features = scaler.fit_transform(df_converted[['Price', 'Area', 'Bedrooms', 'Age']])df_scaled = pd.DataFrame(scaled_features, columns=['Price', 'Area', 'Bedrooms', 'Age'])print("\n标准化后的数据:")print(df_scaled)

方法2:归一化(Min-Max Scaling)

from sklearn.preprocessing import MinMaxScalermin_max_scaler = MinMaxScaler()normalized_features = min_max_scaler.fit_transform(df_converted[['Price', 'Area', 'Bedrooms', 'Age']])df_normalized = pd.DataFrame(normalized_features, columns=['Price', 'Area', 'Bedrooms', 'Age'])print("\n归一化后的数据:")print(df_normalized)

总结

本文详细介绍了基于Python的数据清洗与预处理流程,包括以下几个关键步骤:

导入数据:使用Pandas加载数据。处理缺失值:删除或填充缺失值。检测异常值:通过箱线图或Z分数法识别异常值。数据类型转换:确保数据格式正确。标准化与归一化:优化数值特征的分布。

通过上述步骤,我们可以显著提高数据质量,从而为后续的分析或建模奠定坚实的基础。希望本文的内容能够帮助读者更好地理解和应用数据清洗技术!

免责声明:本文来自网站作者,不代表ixcun的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:aviv@vne.cc
您是本站第11612名访客 今日有38篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!