基于Python的数据清洗与预处理技术

03-15 6阅读

在数据科学领域中,数据清洗和预处理是数据分析和建模过程中不可或缺的重要步骤。无论是机器学习、深度学习还是传统的统计分析方法,都需要高质量的数据作为支撑。然而,在实际应用中,原始数据往往存在缺失值、异常值、重复记录以及格式不一致等问题。因此,对数据进行清洗和预处理显得尤为重要。

本文将介绍如何使用Python语言中的Pandas库来完成数据清洗与预处理工作,并结合具体代码示例进行详细讲解。文章内容包括以下几个方面:缺失值处理、重复数据处理、异常值检测与处理、数据类型转换以及特征工程等。

环境准备

首先,确保您的Python环境中已安装必要的库。如果尚未安装,请通过以下命令安装:

pip install pandas numpy matplotlib seaborn

接下来,在脚本或Jupyter Notebook中导入所需的库:

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns

我们将使用一个虚构的数据集作为示例。假设该数据集包含客户信息,如年龄、收入、购买次数等字段。

# 创建示例数据集data = {    'CustomerID': [1, 2, 3, 4, 5, 6],    'Age': [25, 30, None, 45, 50, 35],    'Income': [50000, 70000, 80000, None, 120000, 90000],    'Purchases': [10, 20, 15, None, 25, 30]}df = pd.DataFrame(data)print(df)

输出结果如下:

   CustomerID   Age   Income  Purchases0           1  25.0  50000.0      10.01           2  30.0  70000.0      20.02           3   NaN  80000.0      15.03           4  45.0      NaN       NaN4           5  50.0  120000.0     25.05           6  35.0  90000.0      30.0

可以看到,数据集中存在一些缺失值(用NaN表示)。

缺失值处理

1. 检测缺失值

在开始处理之前,我们需要先了解哪些列存在缺失值以及缺失的比例。

# 检查每列的缺失值数量missing_values = df.isnull().sum()print(missing_values)# 计算缺失比例missing_ratio = df.isnull().mean() * 100print(missing_ratio)

输出结果如下:

CustomerID      0Age             1Income          1Purchases       1dtype: int64CustomerID     0.0Age            16.666667Income         16.666667Purchases      16.666667dtype: float64

2. 处理缺失值

根据实际情况,我们可以选择删除含有缺失值的行/列,或者对缺失值进行填充。

删除含有缺失值的行

df_cleaned = df.dropna()print(df_cleaned)

填充缺失值

对于数值型数据,可以使用均值、中位数或众数进行填充;对于分类数据,则通常使用众数填充。

# 使用均值填充Age列的缺失值df['Age'].fillna(df['Age'].mean(), inplace=True)# 使用中位数填充Income列的缺失值df['Income'].fillna(df['Income'].median(), inplace=True)# 使用众数填充Purchases列的缺失值df['Purchases'].fillna(df['Purchases'].mode()[0], inplace=True)print(df)

重复数据处理

检查并删除重复记录以保证数据的唯一性。

# 检查重复行duplicates = df[df.duplicated()]print(duplicates)# 删除重复行df_cleaned = df.drop_duplicates()print(df_cleaned)

异常值检测与处理

异常值可能会对模型训练产生不良影响,因此需要对其进行检测和处理。

1. 使用箱线图可视化异常值

plt.figure(figsize=(10, 6))sns.boxplot(data=df[['Age', 'Income', 'Purchases']])plt.title('Box Plot of Numerical Features')plt.show()

2. 使用IQR方法检测并处理异常值

def detect_outliers_iqr(df, column):    Q1 = df[column].quantile(0.25)    Q3 = df[column].quantile(0.75)    IQR = Q3 - Q1    lower_bound = Q1 - 1.5 * IQR    upper_bound = Q3 + 1.5 * IQR    outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)]    return outliersoutliers_age = detect_outliers_iqr(df, 'Age')print("Outliers in Age:", outliers_age)# 移除异常值df_no_outliers = df[~((df['Age'] < outliers_age['Age'].min()) | (df['Age'] > outliers_age['Age'].max()))]print(df_no_outliers)

数据类型转换

有时,数据的类型可能不符合分析需求,例如某些数值型数据应为分类数据。

# 将Age转换为类别(青年、中年、老年)def categorize_age(age):    if age <= 30:        return 'Young'    elif age <= 50:        return 'Middle-aged'    else:        return 'Senior'df['AgeCategory'] = df['Age'].apply(categorize_age)print(df)

特征工程

特征工程旨在从现有数据中提取更多有用的信息,以提高模型性能。

1. 创建新特征

# 创建一个新的特征:平均每次购买金额df['AvgPurchaseAmount'] = df['Income'] / df['Purchases']print(df)

2. 特征编码

对于分类变量,通常需要进行编码处理以便于模型理解。

from sklearn.preprocessing import LabelEncoderle = LabelEncoder()df['AgeCategoryEncoded'] = le.fit_transform(df['AgeCategory'])print(df)

总结

本文详细介绍了如何使用Python中的Pandas库进行数据清洗与预处理。从缺失值处理到重复数据删除,再到异常值检测与处理,最后还涉及了数据类型转换和特征工程等方面的内容。这些步骤都是构建高效数据分析流程的关键部分。通过合理运用上述技术,可以显著提升数据质量,从而为后续的建模工作奠定坚实基础。

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

目录[+]

您是本站第9617名访客 今日有13篇新文章

微信号复制成功

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