引言
在数据分析中,原始数据往往存在缺失、重复、异常等问题。数据预处理是数据科学流程中的关键步骤,直接影响后续分析的准确性。本文将基于Pandas库,系统讲解数据清洗、合并、重塑与转换的核心方法,并通过真实案例演示如何高效完成数据预处理。
一、数据清洗:从脏数据到干净数据
1.1 缺失值处理
检测缺失值:
使用isnull()
和notnull()
函数快速定位缺失值。
import pandas as pd
# 创建含缺失值的DataFrame
df = pd.DataFrame({'A': [1, None, 3], 'B': [5, 6, None]})
print(df.isnull().sum()) # 输出各列缺失值数量
处理缺失值:
-
删除缺失值:
dropna()
df_drop = df.dropna(axis=0) # 删除包含缺失值的行
-
填充缺失值:
fillna()
df_fill = df.fillna({'A': df['A'].mean(), 'B': 0}) # A列填充均值,B列填充0
1.2 重复值处理
检测重复值:duplicated()
df_dup = pd.DataFrame({'A': [1, 2, 2], 'B': ['x', 'y', 'y']})
print(df_dup.duplicated()) # 标记重复行
删除重复值:drop_duplicates()
df_unique = df_dup.drop_duplicates() # 保留首次出现的行
1.3 异常值处理
3σ原则:适用于正态分布数据,剔除超出均值±3倍标准差的值。
def detect_outliers(series):
mean = series.mean()
std = series.std()
lower = mean - 3*std
upper = mean + 3*std
return series[(series < lower) | (series > upper)]
outliers = detect_outliers(df['Age'])
箱形图法:通过四分位数范围(IQR)识别异常值。
df.boxplot(column=['Salary']) # 可视化检测异常值
1.4 数据类型转换
强制转换:astype()
df['Price'] = df['Price'].str.replace('¥', '').astype(float) # 移除符号并转为浮点数
智能转换:pd.to_numeric()
df['Score'] = pd.to_numeric(df['Score'], errors='coerce') # 无效值转为NaN
二、数据合并:整合多源数据
2.1 堆叠合并:concat()
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
result = pd.concat([df1, df2], axis=0) # 纵向堆叠
2.2 主键合并:merge()
left = pd.DataFrame({'key': ['K0', 'K1'], 'value': [1, 2]})
right = pd.DataFrame({'key': ['K0', 'K2'], 'value': [3, 4]})
merged = pd.merge(left, right, on='key', how='left') # 左连接
2.3 索引合并:join()
df_left = pd.DataFrame({'A': [1, 2]}, index=['X', 'Y'])
df_right = pd.DataFrame({'B': [3, 4]}, index=['X', 'Z'])
joined = df_left.join(df_right, how='outer') # 外连接
三、数据重塑:调整数据结构
3.1 分层索引重塑:stack()
与unstack()
# 将列索引转为行索引(生成多层索引)
stacked = df.stack()
# 将行索引转为列索引
unstacked = stacked.unstack()
3.2 轴向旋转:pivot()
pivoted = df.pivot(index='Date', columns='Category', values='Sales')
四、数据转换:增强数据可用性
4.1 面元划分:cut()
将连续数据分段:
ages = pd.Series([18, 22, 25, 30, 35])
bins = [18, 25, 35]
labels = ['Young', 'Adult']
df['AgeGroup'] = pd.cut(ages, bins=bins, labels=labels)
4.2 哑变量处理:get_dummies()
df = pd.DataFrame({'Gender': ['Male', 'Female', 'Male']})
dummies = pd.get_dummies(df['Gender'], prefix='Gender')
五、实战案例:二手房数据预处理
数据集:包含房价、面积、户型、区域等信息,但存在缺失、重复和异常值。
5.1 清洗数据
-
删除缺失行:
df_clean = df.dropna(subset=['Price', 'Area'])
-
处理异常值:剔除单价超过3倍标准差的数据。
mean_price = df['Price'].mean() std_price = df['Price'].std() df = df[(df['Price'] >= mean_price - 3*std_price) & (df['Price'] <= mean_price + 3*std_price)]
5.2 合并与转换
-
合并区域数据:
region_info = pd.read_csv('region_data.csv') merged = pd.merge(df, region_info, on='RegionID')
-
生成户型哑变量:
layout_dummies = pd.get_dummies(df['Layout'], prefix='Layout')
六、总结
数据预处理是数据分析的基石,涉及清洗、合并、重塑与转换四大核心任务。通过Pandas提供的丰富函数,可以高效完成以下工作:
-
清洗:处理缺失、重复、异常值,保证数据质量。
-
合并:整合多源数据,构建完整数据集。
-
重塑:调整数据结构,适配分析需求。
-
转换:增强数据可解释性,如哑变量编码。
掌握这些技能后,可大幅提升数据质量,为后续建模与可视化奠定坚实基础。