数据清洗与预处理
主题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数据清洗与预处理 》
本文最后一次更新为 天前,文章中的某些内容可能已过时!