本文目录导读:

- 目录导读
- 为什么数据分析中需要Eval评估?
- Pandas做Eval评估的核心逻辑与工具
- 案例场景与数据集构造
- 逐步实现:数据加载、清洗、评估与报告生成
- 自动生成Eval评估报告的代码实战
- 问答环节:你可能会遇到的5个高频问题
- 总结与最佳实践建议
Python实战案例:如何用Pandas高效完成数据质量Eval评估(附完整代码)
目录导读
- 为什么数据分析中需要Eval评估?
- Pandas做Eval评估的核心逻辑与工具
- 案例场景与数据集构造
- 逐步实现:数据加载、清洗、评估与报告生成
- 常见评估指标详解(缺失、异常、重复、分布、相关性)
- 自动生成Eval评估报告的代码实战
- 问答环节:你可能会遇到的5个高频问题
- 总结与最佳实践建议
为什么数据分析中需要Eval评估?
在真实的数据分析项目中,我们经常面临“垃圾进,垃圾出”的困境。数据Eval评估是指在建模或分析之前,对原始数据的质量、完整性、一致性和潜在问题进行的系统化检测,这包括:
- 检查缺失值比例
- 识别异常值与离群点
- 检测重复行与重复键
- 分析数值列分布是否符合预期
- 评估类别列的平衡性
- 验证数据类型是否正确
在一份用户行为日志中,若某字段缺失超过70%,或者出现明显超出合理范围的异常值,模型效果将大打折扣。用好Pandas做Eval,可以让你在10分钟内识别出90%的数据质量问题。
Pandas做Eval评估的核心逻辑与工具
Pandas作为Python最成熟的数据处理库,其内建函数足以完成90%的数据质量评估任务,核心工具包括:
- .info() / .describe():快速了解数据结构与统计摘要
- .isnull().sum():缺失值统计
- .duplicated():重复行检测
- .quantile() / IQR法:异常值识别
- .value_counts(normalize=True):类别分布
- .corr():相关性矩阵
但如果你要自动化、批量地实现Eval评估,就需要编写一个eval_data()函数,一次性返回所有关键质量指标,并生成一份可读的报告。
案例场景与数据集构造
假设我们有某电商平台的订单数据(order_data.csv),包含以下字段:
order_id:订单唯一标识user_id:用户IDamount:订单金额order_date:下单日期status:订单状态(pending、shipped、cancelled)product_category:商品品类(electronics、clothing、home、books)
我们将用Pandas模拟一份包含缺失、异常值、重复行的脏数据,并对其做完整的Eval评估。
import pandas as pd
import numpy as np
# 构造模拟数据
np.random.seed(42)
n = 1000
data = {
'order_id': range(1, n+1),
'user_id': np.random.choice(range(1000, 5000), n),
'amount': np.round(np.random.exponential(scale=200, size=n) + 50, 2),
'order_date': pd.date_range('2024-01-01', periods=n, freq='H'),
'status': np.random.choice(['pending', 'shipped', 'cancelled'], n, p=[0.3, 0.5, 0.2]),
'product_category': np.random.choice(['electronics', 'clothing', 'home', 'books'], n, p=[0.4, 0.3, 0.2, 0.1])
}
df = pd.DataFrame(data)
# 故意加入脏数据
# 插入缺失值
df.loc[10:20, 'amount'] = np.nan
df.loc[50:55, 'status'] = None
# 插入异常值(金额>5000)
df.loc[100, 'amount'] = 99999
df.loc[200, 'amount'] = -50
# 插入重复行
df = pd.concat([df, df.iloc[0:5]], ignore_index=True)
print(f"原始数据集形状: {df.shape}")
逐步实现:数据加载、清洗、评估与报告生成
1 基础信息检测
def basic_info(df):
print("=== 数据集基本信息 ===")
print(f"行数: {df.shape[0]}, 列数: {df.shape[1]}")
print(f"内存占用: {df.memory_usage(deep=True).sum() / 1024**2:.2f} MB")
print("-" * 50)
print(df.info(verbose=False))
print("-" * 50)
print(df.describe(include='all').T)
2 缺失值评估
def missing_eval(df):
missing = df.isnull().sum()
missing_pct = (missing / len(df)) * 100
missing_df = pd.DataFrame({
'缺失数量': missing,
'缺失百分比(%)': np.round(missing_pct, 2)
})
missing_df = missing_df[missing_df['缺失数量'] > 0].sort_values(by='缺失百分比(%)', ascending=False)
print("=== 缺失值评估 ===")
if missing_df.empty:
print("✅ 数据集中没有缺失值")
else:
print(missing_df)
return missing_df
3 重复值检测
def duplicate_eval(df):
total_dup = df.duplicated().sum()
subset_dup = df.duplicated(subset=['order_id']).sum()
print("=== 重复值评估 ===")
print(f"完全重复行: {total_dup}")
print(f"order_id列重复: {subset_dup}")
if total_dup > 0:
print("⚠️ 建议处理重复行")
else:
print("✅ 无重复行")
4 异常值检测(IQR法 + 业务规则)
def outlier_eval(df, numeric_cols):
print("=== 异常值评估 (IQR法) ===")
for col in numeric_cols:
if df[col].dtype in ['int64', 'float64'] and df[col].notna().sum() > 0:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df[col] < lower) | (df[col] > upper)][col]
print(f"{col}: 下界={lower:.2f}, 上界={upper:.2f}, 异常值数量={len(outliers)}")
# 业务规则:金额不能为负
neg_count = (df[col] < 0).sum()
if neg_count > 0:
print(f" ⚠️ {col}存在{neg_count}个负值,可能为异常")
5 类别平衡性评估
def category_eval(df, cat_cols):
print("=== 类别字段分布评估 ===")
for col in cat_cols:
if df[col].dtype == 'object' or df[col].dtype.name == 'category':
print(f"\n字段: {col}")
val_counts = df[col].value_counts(normalize=True) * 100
print(val_counts.round(2).to_string())
# 检测是否严重不平衡(某一类占比>90%)
if val_counts.max() > 90:
print(" ⚠️ 该字段存在严重不平衡情况")
6 综合Eval报告生成
def full_eval_report(df, cat_cols=None, numeric_cols=None):
print("="*60)
print("📊 数据质量Eval评估报告")
print("="*60)
basic_info(df)
print("\n")
missing_eval(df)
print("\n")
duplicate_eval(df)
print("\n")
if numeric_cols is None:
numeric_cols = df.select_dtypes(include=[np.number]).columns.tolist()
outlier_eval(df, numeric_cols)
print("\n")
if cat_cols is None:
cat_cols = df.select_dtypes(include=['object', 'category']).columns.tolist()
category_eval(df, cat_cols)
print("\n" + "="*60)
print("✅ Eval评估完成")
自动生成Eval评估报告的代码实战
现在我们直接在模拟数据集上运行全流程评估:
# 运行完整Eval评估 full_eval_report(df) # 输出示例(部分截取): # 📊 数据质量Eval评估报告 # ============================================================ # === 数据集基本信息 === # 行数: 1005, 列数: 6 # === 缺失值评估 === # status 缺失数量: 6, 缺失百分比(%): 0.60 # amount 缺失数量: 11, 缺失百分比(%): 1.09 # === 重复值评估 === # 完全重复行: 5 # order_id列重复: 5 # === 异常值评估 (IQR法) === # amount: 下界=-214.94, 上界=515.02, 异常值数量=43 # ⚠️ amount存在1个负值 # === 类别字段分布评估 === # 字段: status: shipped 50.15%, pending 29.85% # product_category: electronics 39.70%, clothing 30.65%
问答环节:你可能会遇到的5个高频问题
Q1:Eval评估和EDA(探索性数据分析)有什么区别?
A:Eval评估是EDA的子集,主要聚焦于数据质量检测(缺失、异常、重复、类型错误),EDA更广泛,还包含统计分布、可视化发现、特征关系等。简单说:Eval检查“数据是否干净”,EDA探索“数据有什么故事”。
Q2:如果数据量很大(几十万行),用Pandas做Eval会慢吗?
A:Pandas的.info()和.describe()处理百万行数据也很快(毫秒级),但duplicated()和value_counts()在大数据集上会稍慢,建议:先用.sample()抽样快速评估,再对全量数据执行关键检测,另外可以启用pandas.set_option('display.max_rows', None)避免显示截断。
Q3:异常值检测为什么推荐IQR法?
A:IQR法不假设数据为正态分布,对于大多数业务数据(如金额、时长)更稳健,相比之下,标准差法(Z-score)对极端值敏感,且要求数据近似正态。但需注意:IQR法在数据极度偏态或存在大量相同值时效果会打折扣。
Q4:Eval评估后如何自动生成可视化报告?
A:可以结合matplotlib或seaborn绘制缺失值热图、异常值箱线图、类别分布柱状图,更高级的做法是使用pandas-profiling(现在叫ydata-profiling)一键生成HTML报告,涵盖所有Eval指标。
# pip install ydata-profiling
from ydata_profiling import ProfileReport
profile = ProfileReport(df, title="数据质量评估报告")
profile.to_file("eval_report.html")
Q5:如果我在Eval中发现大量缺失值,应该怎么处理?
A:建议分级处理:
- 缺失<5%:直接删除或填充中位数/众数
- 缺失5%-30%:尝试用
SimpleImputer或模型预测填充 - 缺失>30%:考虑删除该特征,或将其转为“是否缺失”的新特征(
isnull列) 重要:先分析缺失机制(随机缺失/非随机缺失)再决定处理方法。
总结与最佳实践建议
通过真实案例可以看到,用Pandas做数据质量Eval评估只需要不到20行核心代码,就能完成以下关键检测:
| 评估维度 | 使用工具 | 关键输出 |
|---|---|---|
| 基础信息 | .info() |
类型、内存、非空计数 |
| 缺失值 | .isnull().sum() |
缺失数量与百分比 |
| 重复值 | .duplicated() |
完全/部分重复行数 |
| 异常值 | IQR法 + 业务规则 | 异常数量与边界 |
| 类别平衡 | .value_counts() |
各分类占比 |
| 分布形态 | .describe() |
均值、标准差、分位数 |
最佳实践建议:
- 将Eval评估函数化,封装成
eval_pipeline(),在不同数据集上复用 - 设置质量阈值:例如缺失>20%自动报警,异常值>5%标记为高风险
- 保留Eval日志:每次评估后记录时间、数据集版本、发现问题个数
- 结合可视化:缺失热图 + 箱线图 + 分布直方图是标配三件套
- 持续监控:对于定期更新的数据管道,将Eval评估嵌入到ETL流程中
掌握了Pandas的Eval评估能力,你就能在数据分析的第一步就牢牢把控数据质量,为后续建模和洞察打下坚实基础,现在就打开你的Python环境,动手试试这个实战案例吧!
文章首发于数据分析学习社区,欢迎转载分享(保留出处:Python数据清洗实战系列)