缺失值处理、异常值检测、数据转换

主题2:数据清洗与预处理

数据清洗与预处理是数据分析和建模的基础性步骤,良好的数据清洗能够确保数据质量,进而提高模型的表现和准确性。

1. 缺失值处理

缺失值处理是数据清洗中的常见任务。数据集中的缺失值可能会影响分析和建模结果,因此需要采取合理的方式进行处理。

1.1 检测缺失值

检测缺失值的目的是找出数据集中的空白数据或无效数据。常用的方法是 isnull()isna(),它们会返回布尔型的 DataFrame,标记每个位置是否为缺失值。

方法功能返回值类型示例代码
isnull()检测缺失值布尔型 DataFramedf.isnull()
isna()功能与 isnull() 相同布尔型 DataFramedf.isna()
sum()计算缺失值的数量整数df.isnull().sum()

示例:

df.isnull()  # 检测缺失值
df.isnull().sum()  # 计算每列缺失值的数量

1.2 删除缺失值

删除缺失值的主要目的是清除不完整的数据,从而避免它们对模型训练产生不良影响。

方法说明参数返回值
dropna(axis=0)删除含有缺失值的行axis=0(按行删除)删除缺失值后的 DataFrame
dropna(axis=1)删除含有缺失值的列axis=1(按列删除)删除缺失值后的 DataFrame
inplace=True在原地删除数据修改原 DataFrame

示例:

df.dropna(axis=0, inplace=True)  # 删除含有缺失值的行
df.dropna(axis=1, inplace=True)  # 删除含有缺失值的列

1.3 填充缺失值

如果删除缺失值不合适,可以使用填充方法填补缺失值。常见的填充方法包括均值填充、众数填充等。

方法说明参数返回值
fillna(value)使用指定的值填充缺失值value=均值、中位数填充后的 DataFrame
fillna(method='ffill')使用前向填充填补缺失值method='ffill'填充后的 DataFrame
fillna(method='bfill')使用后向填充填补缺失值method='bfill'填充后的 DataFrame

示例:

df['A'].fillna(df['A'].mean(), inplace=True)  # 使用均值填充缺失值
df['B'].fillna(method='ffill', inplace=True)  # 使用前向填充

1.4 插值法

插值法是一种基于已知数据点推测缺失值的技术,特别适用于时间序列数据。

方法说明参数返回值
interpolate(method='linear')基于线性插值填充缺失值method='linear'填充后的 DataFrame
interpolate(method='polynomial', order=2)使用多项式插值填充缺失值method='polynomial'填充后的 DataFrame

示例:

df['A'].interpolate(method='linear', inplace=True)  # 使用线性插值

2. 重复数据处理

重复数据是数据中的冗余信息,可能会引入偏差并影响数据的有效性。处理重复数据时,我们可以通过检测和删除重复行来清理数据。

2.1 检测重复数据

使用 duplicated() 方法检测数据集中的重复行。它会返回一个布尔型的 Series,标记哪些行是重复的。

方法功能返回值类型示例代码
duplicated()检测重复行布尔型 Seriesdf.duplicated()
sum()计算重复行的数量整数df.duplicated().sum()

示例:

df.duplicated()  # 检测重复数据
df.duplicated().sum()  # 计算重复行的数量

2.2 删除重复数据

删除重复数据可以通过 drop_duplicates() 方法实现。该方法可以删除完全相同的重复行,也可以选择根据特定的列进行去重。

方法说明参数返回值
drop_duplicates()删除完全相同的重复行subset=[...]删除重复数据后的 DataFrame
drop_duplicates(subset=['col1'])根据指定列去重subset(列名)删除重复数据后的 DataFrame

示例:

df.drop_duplicates(inplace=True)  # 删除重复行
df.drop_duplicates(subset=['A'], inplace=True)  # 根据 A 列去重

3. 异常值检测与处理

异常值是指在数据集中明显偏离大多数数据点的值,这些值可能会影响模型的训练效果,因此需要检测并处理。

3.1 Z 分数法

Z 分数法是通过衡量一个数据点距离均值的标准差来检测异常值。通常情况下,Z 分数大于 3 或小于 -3 的数据点被认为是异常值。

方法功能参数返回值
zscore()计算 Z 分数Z 分数值
abs(Z)计算绝对值 Z 分数Z 分数的绝对值

示例:

from scipy.stats import zscore
df['A_zscore'] = zscore(df['A'])  # 计算 Z 分数

3.2 IQR 方法

IQR(四分位距)方法基于数据的四分位数检测异常值。计算 Q1 和 Q3(第一个和第三个四分位数),然后计算 IQR(Q3 - Q1)。通常,IQR 小于 Q1 - 1.5 * IQR 或大于 Q3 + 1.5 * IQR 的数据点被视为异常值。

方法功能参数返回值
quantile()计算数据的四分位数q=0.25, q=0.75返回 Q1 或 Q3 的值
IQR计算四分位距并检测异常值返回异常值

示例:

Q1 = df['A'].quantile(0.25)
Q3 = df['A'].quantile(0.75)
IQR = Q3 - Q1
df_outliers = df[(df['A'] < (Q1 - 1.5 * IQR)) | (df['A'] > (Q3 + 1.5 * IQR))]

3.3 处理异常值

处理异常值的方法可以是删除异常值或将其替换为合理的值(如中位数或均值)。处理异常值时,需要考虑数据的性质和业务背景。

方法说明参数返回值
删除异常值删除异常值数据删除异常值后的 DataFrame
替换异常值用中位数或均值替代异常值method='mean'替换后的 DataFrame

示例:

df = df[(df['A'] >= (Q1 - 1.5 * IQR)) & (df['A'] <= (Q3 + 1.5 * IQR))]  # 删除异常值

4. 数据类型转换

数据类型的正确性对数据分析至关重要。不同的数据类型对于数据的存储和计算效率有不同的影响。

4.1 转换为数值型

如果数据列应为数值类型,但被错误地存储为字符串类型,可以使用 pd.to_numeric() 进行转换。

方法功能参数返回值
pd.to_numeric()将字符串列转换为数值型errors='coerce'转换后的数值型数据

示例:

df['A'] = pd.to_numeric(df['A'], errors='coerce')  # 转换为数值型

4.2 转换为日期时间类型

如果数据列包含日期信息,但存储为字符串,可以使用 pd.to_datetime() 进行转换。

方法功能参数返回值
pd.to_datetime()将字符串列转换为日期时间类型format='%Y-%m-%d'转换后的日期时间数据

示例:

df['date'] = pd.to_datetime(df['date'])  # 转换为日期时间类型

版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。

(采用 CC BY-NC-SA 4.0 许可协议进行授权)

本文标题:Python 数据科学系列——数据清洗与预处理

本文链接:https://www.sshipanoo.com/blog/ai/python-data-science/Python数据清洗与预处理/

本文最后一次更新为 天前,文章中的某些内容可能已过时!