Python数据分析与应用:数据预处理

引言

在数据分析中,原始数据往往存在缺失、重复、异常等问题。数据预处理是数据科学流程中的关键步骤,直接影响后续分析的准确性。本文将基于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 清洗数据

  1. 删除缺失行

    df_clean = df.dropna(subset=['Price', 'Area'])
  2. 处理异常值:剔除单价超过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 合并与转换

  1. 合并区域数据

    region_info = pd.read_csv('region_data.csv')
    merged = pd.merge(df, region_info, on='RegionID')
  2. 生成户型哑变量

    layout_dummies = pd.get_dummies(df['Layout'], prefix='Layout')


六、总结

数据预处理是数据分析的基石,涉及清洗、合并、重塑与转换四大核心任务。通过Pandas提供的丰富函数,可以高效完成以下工作:

  • 清洗:处理缺失、重复、异常值,保证数据质量。

  • 合并:整合多源数据,构建完整数据集。

  • 重塑:调整数据结构,适配分析需求。

  • 转换:增强数据可解释性,如哑变量编码。

掌握这些技能后,可大幅提升数据质量,为后续建模与可视化奠定坚实基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值