数据预处理
数据清洗
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 df
3. 重复值处理
重复值会影响数据分析的准确性,需要根据业务需求决定是否删除。
# 重复值处理方法 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' )