数据清洗与预处理

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

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

1. 缺失值处理

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

1.1 检测缺失值

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

方法 功能 返回值类型 示例代码
isnull() 检测缺失值 布尔型 DataFrame df.isnull()
isna() 功能与 isnull() 相同 布尔型 DataFrame df.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() 检测重复行 布尔型 Series df.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数据清洗与预处理 》

本文链接:http://0.0.0.0:3015/ai/Python%E6%95%B0%E6%8D%AE%E6%B8%85%E6%B4%97%E4%B8%8E%E9%A2%84%E5%A4%84%E7%90%86.html

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