悠悠楠杉
Python数据清洗实战:用Pandas打造高质量数据集的5个核心技巧
Python数据清洗实战:用Pandas打造高质量数据集的5个核心技巧
数据清洗是数据分析中耗时最长却至关重要的环节。作为Python生态中最强大的数据处理工具,Pandas提供了诸多高效清洗数据的技巧。本文将分享我在实际项目中总结的Pandasc数据清洗方法论,帮助您将杂乱数据转化为可靠的分析基础。
一、理解数据:清洗前的侦探工作
核心方法:info()
与describe()
的组合拳
python
import pandas as pd
加载数据集
df = pd.readcsv('rawdata.csv')
第一视角观察
print(f"数据集形状:{df.shape}")
print("\n=== 数据类型概览 ===")
print(df.info())
数值型数据分布
print("\n=== 数值特征统计 ===")
print(df.describe(include='all')) # 包含非数值列
实际应用场景:最近处理电商用户数据时,通过这种方法发现本应存放用户ID的列居然有30%的缺失值,及时调整了数据收集策略。
二、缺失值处理的进阶策略
比简单填充更有效的3种方法
可视化定位缺失值
python import seaborn as sns sns.heatmap(df.isnull(), cbar=False)
基于业务逻辑的智能填充python
针对电商场景的典型处理
df['userlevel'] = df['userlevel'].fillna('guest') # 未登录用户设为访客
df['purchaseamount'] = df.groupby('usertype')['purchase_amount'].transform(
lambda x: x.fillna(x.median()))
- 创建缺失值标记特征
python df['is_age_missing'] = df['age'].isnull().astype(int)
三、异常值检测与处理的工程化方法
三步处理流程:
统计检测法
python Q1 = df['price'].quantile(0.25) Q3 = df['price'].quantile(0.75) IQR = Q3 - Q1 price_outliers = df[(df['price'] < (Q1 - 1.5*IQR)) | (df['price'] > (Q3 + 1.5*IQR))]
业务规则过滤
python valid_ages = df[(df['age'] >= 13) & (df['age'] <= 100)]
保留异常但标记
python df['is_price_outlier'] = ((df['price'] - df['price'].mean()) / df['price'].std()).abs() > 3
四、文本数据清洗的完整流水线
新闻类数据清洗实例:
python
import re
from tqdm import tqdm
tqdm.pandas() # 启用进度条
def clean_text(text):
if not isinstance(text, str):
return ""
# 1. 去除特殊字符但保留中文标点
text = re.sub(r'[^\w\u4e00-\u9fa5,。?!、:;"“”‘’\']', ' ', text)
# 2. 统一全半角字符
text = text.translate(str.maketrans('1234567890', '1234567890'))
# 3. 处理连续空格
return re.sub(r'\s+', ' ', text).strip()
df['content'] = df['content'].progressapply(cleantext)
处理前后对比:
原始文本:"2023年最新报告显示,GDP增长达5.2%!!!"
清洗后:"2023年最新报告显示 GDP增长达5.2%"
五、日期/时间数据的规范化处理
常见问题解决方案:
python
处理多格式日期
df['orderdate'] = pd.todatetime(df['order_date'],
format='mixed',
errors='coerce')
提取时间特征
df['orderyear'] = df['orderdate'].dt.year
df['orderweekday'] = df['orderdate'].dt.day_name()
处理时区问题
df['servertime'] = (pd.todatetime(df['timestamp'], unit='ms')
.dt.tzlocalize('UTC')
.dt.tzconvert('Asia/Shanghai'))
六、保存清洗成果的工程实践
推荐保存格式与技巧:
python
1. 保存清洗后的数据
df.toparquet('cleaneddata.parquet', engine='pyarrow')
2. 保存清洗日志
cleaninglog = {
'originalsize': rawshape,
'cleanedsize': df.shape,
'droppedcolumns': list(droppedcols),
'missingvaluestats': missingstats.todict()
}
import json
with open('cleaninglog.json', 'w') as f:
json.dump(cleaninglog, f, indent=2)
专家提示:建议保存原始数据和清洗脚本而非中间结果,便于后续调整清洗逻辑。
结语:数据清洗的艺术
在实际项目中,我发现优秀的数据清洗工程师需要具备三种思维:
1. 侦探思维:通过数据表象发现背后的业务问题
2. 工程思维:构建可复用的清洗流程
3. 保守思维:对每个清洗操作保持质疑态度
记住,没有完美的清洗方法,只有最适合当前业务场景的解决方案。建议每次清洗后保留详细的处理日志,这将为后续分析提供宝贵的上下文信息。
经验之谈:曾有个金融风控项目,因为保留了完整的清洗记录,在模型出现偏差时快速定位到是某个边缘case的清洗规则过于严格导致,节省了大量排查时间。