目录
数据清洗
数据清洗是数据处理的第一步,目的是去除噪声数据、处理缺失值和异常值,使数据更加干净、可用
缺失值处理
删除缺失值:
如果数据集中缺失值较少,可以直接删除包含缺失值的行或列
python
## 数据清洗
# 缺失值处理
# 删除缺失值
import pandas as pd
# 创建一个包含缺失值的DataFrame
data = {'A': [1, 2, None, 4], 'B': [5, None, 7, 8]}
df = pd.DataFrame(data)
# 删除包含缺失值的行
df_dropped = df.dropna(axis=0)
print("删除缺失值后的数据:")
print(df_dropped)
# A B
# 0 1.0 5.0
# 3 4.0 8.0
填充缺失值:
如果删除缺失值会导致数据量损失过多,可以选择填充缺失值。常见的填充方法包括使用均值、中位数、众数或前向/后向填充
python
# 填充缺失值
# 使用均值填充缺失值
df_mean = df.fillna(df.mean())
print("使用均值填充后的数据:")
print(df_mean)
# A B
# 0 1.000000 5.000000
# 1 2.000000 6.666667
# 2 2.333333 7.000000
# 3 4.000000 8.000000
df_mode = df.fillna(df.mode())
print("使用众数填充后的数据:")
print(df_mode)
# A B
# 0 1.0 5.0
# 1 2.0 7.0
# 2 4.0 7.0
# 3 4.0 8.0
# 使用前向填充
df_ffilled = df.fillna(method='ffill')
print("使用前向填充后的数据:")
print(df_ffilled)
# A B
# 0 1.0 5.0
# 1 2.0 5.0
# 2 2.0 7.0
# 3 4.0 8.0
重复值处理
在数据处理中,重复值可能会对模型训练和分析结果产生误导性的影响,因此需要进行检测和处理
检测重复值
在处理重复值之前,首先需要检测数据中是否存在重复的行或列
python
# 重复值处理
# 检测重复值
import pandas as pd
# 创建一个包含重复行的 DataFrame
data = {'A': [1, 2, 3, 2, 1], 'B': [4, 5, 6, 5, 4]}
df = pd.DataFrame(data)
# 检测重复行
duplicates = df.duplicated()
print("重复行:")
print(duplicates)
# 0 False
# 1 False
# 2 False
# 3 True
# 4 True
# dtype: bool
# 显示重复的行
print("重复的行数据:")
print(df[duplicates])
# A B
# 3 2 5
# 4 1 4
# 检测重复列
duplicates_columns = df.T.duplicated()
print("重复列:")
print(duplicates_columns)
# A False
# B False
# dtype: bool
# 显示重复的列
print("重复的列数据:")
print(df.loc[:, duplicates_columns])
# Empty DataFrame
# Columns: []
# Index: [0, 1, 2, 3, 4]
处理重复值
处理重复值的方法通常包括删除重复值或保留一条重复记录
python
# 处理重复值
# 删除重复行
df_cleaned = df.drop_duplicates()
print("删除重复行后的数据:")
print(df_cleaned)
# A B
# 0 1 4
# 1 2 5
# 2 3 6
# 删除重复列
df_cleaned_columns = df.loc[:, ~duplicates_columns]
print("删除重复列后的数据:")
print(df_cleaned_columns)
# A B
# 0 1 4
# 1 2 5
# 2 3 6
# 3 2 5
# 4 1 4
# 保留第一条重复记录
df_keep_first = df.drop_duplicates(keep='first')
print("保留第一条重复记录后的数据:")
print(df_keep_first)
# A B
# 0 1 4
# 1 2 5
# 2 3 6
# 保留最后一条重复记录
df_keep_last = df.drop_duplicates(keep='last')
print("保留最后一条重复记录后的数据:")
print(df_keep_last)
# A B
# 2 3 6
# 3 2 5
# 4 1 4
异常值处理
异常值是指数据中明显偏离正常范围的值,需要进行检测和处理
Z-score方法
通过标准化方法检测异常值
python
# 异常值处理
# Z-score
from scipy import stats
import numpy as np
data = [1, 2, 3, 4, 100]
z_scores = stats.zscore(data)
print("Z-scores:", z_scores)
# [-0.53828462 -0.51265202 -0.48701942 -0.46138681 1.99934286]
# 检测异常值(Z-score大于1或小于-1)
threshold = 1
outliers = np.where(np.abs(z_scores) > threshold)
print("异常值索引:", outliers)
# (array([4], dtype=int64),)
IQR方法(四分位距)
通过四分位数检测异常值
python
# IQR方法(四分位距)
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
print("下界:", lower_bound) # -1.0
print("上界:", upper_bound) # 7.0
outliers = [x for x in data if x < lower_bound or x > upper_bound]
print("异常值:", outliers) # [100]
数据一致性检查
确保数据在逻辑上是合理的,例如日期格式、数值范围等
python
# 数据一致性检查
# 检查日期格式
import pandas as pd
data = {'date': ['2025-01-01', '2025-02-30', '2025-03-15']}
df = pd.DataFrame(data)
# 尝试将日期列转换为日期格式,错误的日期会报错
df['date'] = pd.to_datetime(df['date'], errors='coerce')
print("转换后的数据:")
print(df)
# date
# 0 2025-01-01
# 1 NaT
# 2 2025-03-15
数据转换
数据转换是将数据转换为适合模型处理的格式,常见的方法包括规范化、标准化、离散化等
规范化(归一化)
将数据缩放到指定范围,如0, 1或-1, 1
Min-Max归一化
将数据缩放到0, 1区间
python
## 数据转换
# 规范化(归一化)
# Min-Max归一化
from sklearn.preprocessing import MinMaxScaler
data = [[1], [2], [3], [4]]
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data)
print("归一化后的数据:")
print(normalized_data)
# [[0. ]
# [0.33333333]
# [0.66666667]
# [1. ]]
MaxAbsScaler
将数据缩放到-1, 1区间
python
# MaxAbsScaler
from sklearn.preprocessing import MaxAbsScaler
scaler = MaxAbsScaler()
normalized_data = scaler.fit_transform(data)
print("MaxAbsScaler归一化后的数据:")
print(normalized_data)
# [[0.25]
# [0.5 ]
# [0.75]
# [1. ]]
标准化
将数据转换为均值为0、标准差为1的分布
python
# 标准化
from sklearn.preprocessing import StandardScaler
data = [[1], [2], [3], [4]]
scaler = StandardScaler()
standardized_data = scaler.fit_transform(data)
print("标准化后的数据:")
print(standardized_data)
# [[-1.34164079]
# [-0.4472136 ]
# [ 0.4472136 ]
# [ 1.34164079]]
离散化
将连续数据划分为离散区间
等宽离散化
将数据划分为等宽的区间
python
# 离散化
# 等宽离散化
import pandas as pd
data = {'score': [85, 90, 78, 92, 88, 76, 95, 89, 77, 82]}
df = pd.DataFrame(data)
df['score_discret'] = pd.cut(df['score'], bins=3, labels=False)
print("等宽离散化后的数据:")
print(df)
# score score_discret
# 0 85 1
# 1 90 2
# 2 78 0
# 3 92 2
# 4 88 1
# 5 76 0
# 6 95 2
# 7 89 2
# 8 77 0
# 9 82 0
等频离散化
将数据划分为等数量的区间
python
# 等频离散化
df['score_discret'] = pd.qcut(df['score'], q=3, labels=False)
print("等频离散化后的数据:")
print(df)
# score score_discret
# 0 85 1
# 1 90 2
# 2 78 0
# 3 92 2
# 4 88 1
# 5 76 0
# 6 95 2
# 7 89 1
# 8 77 0
# 9 82 0