前言
数据清洗是数据分析的第一步,也是最费时间的环节。俗话说"数据科学家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)
总结
数据清洗没有标准答案,关键是理解业务逻辑后再选择合适的处理方式。记住:
-
先了解数据,再动手清洗
-
缺失值处理要结合业务场景
-
异常值不一定是错误,也可能是重要信息
-
清洗前先备份原始数据
觉得有用的话,转发给需要的朋友!