数据预处理
数据清洗
1. 缺失值处理
缺失值是数据集中常见的问题,需要根据具体情况选择合适的处理方法。
# 缺失值处理方法 1. 删除法 - 删除包含缺失值的行 - 删除缺失值比例过高的列 - 适用于缺失值较少的情况 2. 统计量填充 - 数值型:均值、中位数、众数 - 分位数填充 - 适用于随机缺失 3. 模型预测填充 - 回归模型预测 - 分类模型预测 - 适用于非随机缺失 4. 多重插补 - 基于统计模型 - 考虑缺失值的不确定性 - 生成多个可能的填充值 # 代码示例 import pandas as pd import numpy as np from sklearn.impute import SimpleImputer, KNNImputer # 1. 删除法 df_drop = df.dropna() # 删除任何包含缺失值的行 df_drop_cols = df.dropna(axis=1, thresh=0.8) # 删除缺失值比例超过20%的列 # 2. 统计量填充 # 均值填充 imputer_mean = SimpleImputer(strategy='mean') df_mean = pd.DataFrame(imputer_mean.fit_transform(df), columns=df.columns) # 中位数填充 imputer_median = SimpleImputer(strategy='median') df_median = pd.DataFrame(imputer_median.fit_transform(df), columns=df.columns) # 3. KNN填充 imputer_knn = KNNImputer(n_neighbors=5) df_knn = pd.DataFrame(imputer_knn.fit_transform(df), columns=df.columns) # 4. 多重插补 from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer imputer_iter = IterativeImputer(random_state=42) df_iter = pd.DataFrame(imputer_iter.fit_transform(df), columns=df.columns)
2. 异常值处理
异常值检测和处理是数据清洗的重要环节,需要结合业务场景选择合适的处理方法。
# 异常值检测方法
1. 统计方法
- Z-score法
- IQR法
- 3-sigma法则
2. 基于距离的方法
- 欧氏距离
- 马氏距离
- K近邻
3. 基于密度的方法
- LOF(局部异常因子)
- DBSCAN
- 孤立森林
# 代码示例
import numpy as np
from scipy import stats
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
# 1. Z-score法
def detect_outliers_zscore(data, threshold=3):
z_scores = np.abs(stats.zscore(data))
return np.where(z_scores > threshold)
# 2. IQR法
def detect_outliers_iqr(data):
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return np.where((data < lower_bound) | (data > upper_bound))
# 3. 孤立森林
def detect_outliers_iforest(data):
clf = IsolationForest(contamination=0.1, random_state=42)
return clf.fit_predict(data)
# 4. LOF
def detect_outliers_lof(data):
clf = LocalOutlierFactor(contamination=0.1)
return clf.fit_predict(data)
# 异常值处理
def handle_outliers(df, column, method='iqr'):
if method == 'iqr':
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
df[column] = df[column].clip(lower=Q1-1.5*IQR, upper=Q3+1.5*IQR)
elif method == 'zscore':
mean = df[column].mean()
std = df[column].std()
df[column] = df[column].clip(lower=mean-3*std, upper=mean+3*std)
return df3. 重复值处理
重复值会影响数据分析的准确性,需要根据业务需求决定是否删除。
# 重复值处理方法
1. 完全重复
- 删除完全相同的行
- 保留第一次出现的记录
- 保留最后一次出现的记录
2. 部分重复
- 基于关键字段去重
- 合并重复记录
- 保留最新/最旧记录
# 代码示例
import pandas as pd
# 1. 完全重复
# 删除完全重复的行
df_drop_duplicates = df.drop_duplicates()
# 保留第一次出现的记录
df_keep_first = df.drop_duplicates(keep='first')
# 保留最后一次出现的记录
df_keep_last = df.drop_duplicates(keep='last')
# 2. 部分重复
# 基于特定列去重
df_drop_duplicates_subset = df.drop_duplicates(subset=['col1', 'col2'])
# 合并重复记录
def merge_duplicates(df, key_columns, agg_dict):
return df.groupby(key_columns).agg(agg_dict).reset_index()
# 示例:合并重复记录,保留最新数据
df_merged = df.sort_values('timestamp').drop_duplicates(
subset=['user_id', 'product_id'],
keep='last'
)