Pandas数据清洗完整指南:8大核心技巧详解(2026实战版)

0 阅读3分钟

前言

数据清洗是数据分析的第一步,也是最费时间的环节。俗话说"数据科学家80%的时间都在清洗数据",一点都不夸张。

本文整理了Pandas数据清洗的8大核心技巧,每个都附带完整代码示例,帮你把脏数据变成可直接分析的干净数据。

技巧一:快速识别缺失值

拿到数据后,第一步是检查缺失值情况。

import pandas as pd
import numpy as np

# 读取数据
df = pd.read_csv('data.csv')

# 查看每列缺失值数量和比例
missing_info = pd.DataFrame({
    '缺失数量': df.isnull().sum(),
    '缺失比例': (df.isnull().sum() / len(df) * 100).round(2).astype(str) + '%'
})
print(missing_info[missing_info['缺失数量'] > 0])

输出结果清晰展示每列的缺失情况,一目了然。

技巧二:删除或填充缺失值

根据业务逻辑选择处理方式:

# 删除缺失值超过30%的列
threshold = len(df) * 0.7
df_clean = df.dropna(axis=1, thresh=threshold)

# 用均值填充数值列缺失值
numeric_cols = df_clean.select_dtypes(include=[np.number]).columns
df_clean[numeric_cols] = df_clean[numeric_cols].fillna(df_clean[numeric_cols].mean())

# 用众数填充分类列
cat_cols = df_clean.select_dtypes(include=['object']).columns
for col in cat_cols:
    df_clean[col].fillna(df_clean[col].mode()[0], inplace=True)

技巧三:去除重复数据

# 查看重复行数量
print(f"重复行数: {df.duplicated().sum()}")

# 删除完全重复的行
df_no_dup = df.drop_duplicates()

# 基于特定列删除重复,保留第一条
df_no_dup = df.drop_duplicates(subset=['user_id', 'order_date'], keep='first')

技巧四:数据类型转换

# 将字符串日期转换为datetime
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d')

# 将分类数据转换为category类型(节省内存)
df['status'] = df['status'].astype('category')

# 批量转换数值列(处理字符串中的逗号)
price_cols = [col for col in df.columns if 'price' in col.lower()]
for col in price_cols:
    df[col] = df[col].astype(str).str.replace(',', '').astype(float)

技巧五:字符串清洗

# 去除首尾空格
df['name'] = df['name'].str.strip()

# 统一大小写
df['city'] = df['city'].str.lower()

# 去除特殊字符
df['phone'] = df['phone'].str.replace(r'[^\d]', '', regex=True)

# 处理缺失值后的字符串操作
df['email'] = df['email'].str.lower().str.strip()

技巧六:异常值检测与处理

# 使用IQR方法检测异常值
def handle_outliers(df, column):
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    # 用边界值替换异常值
    df[column] = df[column].clip(lower=lower_bound, upper=upper_bound)
    return df

# 应用到所有数值列
numeric_cols = df.select_dtypes(include=[np.number]).columns
for col in numeric_cols:
    df = handle_outliers(df, col)

技巧七:合并与重塑数据

# 合并多个数据源
df_merged = pd.merge(df_users, df_orders, on='user_id', how='left')

# 追加新数据
df_updated = pd.concat([df_old, df_new], ignore_index=True)

# 透视表转换
pivot = df.pivot_table(
    values='sales',
    index='region',
    columns='quarter',
    aggfunc='sum',
    fill_value=0
)

技巧八:标准化数据格式

# 重命名列(统一命名规范)
df.columns = df.columns.str.lower().str.replace(' ', '_')

# 重新排序列(按逻辑顺序)
col_order = ['id', 'date', 'region', 'product', 'sales', 'cost', 'profit']
df = df[[col for col in col_order if col in df.columns]]

# 筛选有效数据
df = df[(df['sales'] > 0) & (df['date'] >= '2024-01-01')]

完整示例代码

import pandas as pd
import numpy as np

# 一站式数据清洗函数
def clean_data(df):
    # 1. 统一列名
    df.columns = df.columns.str.lower().str.replace(' ', '_')

    # 2. 处理缺失值
    for col in df.select_dtypes(include=[np.number]).columns:
        df[col].fillna(df[col].median(), inplace=True)
    for col in df.select_dtypes(include=['object']).columns:
        df[col].fillna('Unknown', inplace=True)

    # 3. 去重
    df.drop_duplicates(inplace=True)

    # 4. 数据类型转换
    if 'date' in df.columns:
        df['date'] = pd.to_datetime(df['date'], errors='coerce')

    return df

# 使用
df = pd.read_csv('raw_data.csv')
df_clean = clean_data(df)
df_clean.to_csv('clean_data.csv', index=False)

总结

数据清洗没有标准答案,关键是理解业务逻辑后再选择合适的处理方式。记住:

  1. 先了解数据,再动手清洗

  2. 缺失值处理要结合业务场景

  3. 异常值不一定是错误,也可能是重要信息

  4. 清洗前先备份原始数据

觉得有用的话,转发给需要的朋友!