导航菜单

数据预处理

数据清洗

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'
)