本文目录导读:

我来介绍几个用Pandas进行数据分组验证的实用案例。
基础分组验证
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'部门': ['技术部', '市场部', '技术部', '人事部', '市场部', '技术部'],
'员工': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
'工资': [15000, 12000, 18000, 10000, 13000, 16000],
'绩效': ['A', 'B', 'A', 'C', 'B', 'A']
})
# 1. 验证每组数据量(数据完整性检查)
group_counts = df.groupby('部门').size()
print("各部门人数验证:")
print(group_counts)
print(f"总人数验证:{group_counts.sum()} 人\n")
# 2. 验证每组非空值
missing_check = df.groupby('部门').apply(lambda x: x.isnull().sum())
print("缺失值检查:")
print(missing_check)
数据一致性验证
# 创建有问题的数据
df_validate = pd.DataFrame({
'订单号': ['ORD001', 'ORD001', 'ORD002', 'ORD002', 'ORD003'],
'产品': ['A', 'B', 'A', 'B', 'A'],
'数量': [10, 5, 15, 3, 8],
'金额': [100, 50, 150, 30, 80],
'状态': ['已完成', '已完成', '处理中', '处理中', '已完成']
})
# 验证同一订单的状态一致性
def check_status_consistency(group):
"""检查组内所有状态是否一致"""
unique_status = group['状态'].unique()
return len(unique_status) == 1
status_check = df_validate.groupby('订单号').apply(check_status_consistency)
print("订单状态一致性验证:")
print(status_check)
print(f"状态一致的订单数:{status_check.sum()} / {len(status_check)}\n")
# 验证金额总和与单价关系
def validate_amount(group):
"""验证分组内的金额计算"""
# 假设单价为10,验证金额 = 数量 * 单价
expected_amount = group['数量'] * 10
actual_amount = group['金额']
is_valid = (expected_amount == actual_amount).all()
return is_valid
amount_check = df_validate.groupby('订单号').apply(validate_amount)
print("金额计算验证:")
print(amount_check)
数据范围和边界验证
# 创建包含异常值的数据
df_range = pd.DataFrame({
'地区': ['华东', '华东', '华南', '华南', '华北', '华北'],
'月份': [1, 2, 1, 2, 1, 2],
'销售额': [100, 200, 300, 4000, 150, 250], # 4000可能为异常值
'温度': [25, 26, 28, 29, -10, 5] # -10可能为异常值
})
# 验证每组数值范围
def check_value_range(group, column, min_val, max_val):
"""检查指定列的值是否在范围内"""
values = group[column]
in_range = (values >= min_val) & (values <= max_val)
return in_range.all()
# 检查销售额范围(100-500)
sales_check = df_range.groupby('地区').apply(
lambda x: check_value_range(x, '销售额', 100, 500)
)
print("销售额范围验证:")
print(sales_check)
# 检查温度范围(-5到40度)
temp_check = df_range.groupby('地区').apply(
lambda x: check_value_range(x, '温度', -5, 40)
)
print("\n温度范围验证:")
print(temp_check)
多条件分组验证
# 创建更复杂的数据
df_complex = pd.DataFrame({
'项目': ['P1', 'P1', 'P1', 'P2', 'P2', 'P3'],
'阶段': ['规划', '执行', '完成', '规划', '执行', '规划'],
'预算': [10000, 5000, 3000, 20000, 8000, 15000],
'实际支出': [9500, 4800, 2800, 21000, 7500, 16000]
})
def comprehensive_validation(group):
"""综合验证函数"""
results = {}
# 1. 验证预算不超支
total_budget = group['预算'].sum()
total_expense = group['实际支出'].sum()
results['预算充足'] = total_expense <= total_budget * 1.1
# 2. 验证各阶段支出占比合理
expense_ratio = group['实际支出'] / group['预算']
results['支出比例合理'] = (expense_ratio >= 0.5).all() and (expense_ratio <= 1.0).all()
# 3. 验证阶段顺序
expected_order = {'规划': 1, '执行': 2, '完成': 3}
phases = group['阶段'].tolist()
phase_order = [expected_order.get(p, 0) for p in phases]
results['阶段顺序正确'] = phase_order == sorted(phase_order)
return pd.Series(results)
validation_results = df_complex.groupby('项目').apply(comprehensive_validation)
print("多条件综合验证结果:")
print(validation_results)
数据分组验证报告
def generate_validation_report(data, group_col, validation_cols):
"""生成分组验证报告"""
report = {}
for col in validation_cols:
col_report = {}
# 基本统计
grouped = data.groupby(group_col)[col]
col_report['均值'] = grouped.mean()
col_report['标准差'] = grouped.std()
col_report['最小值'] = grouped.min()
col_report['最大值'] = grouped.max()
col_report['缺失值数'] = data.groupby(group_col).apply(
lambda x: x[col].isnull().sum()
)
# 异常检测(使用IQR方法)
def detect_outliers(group):
Q1 = group.quantile(0.25)
Q3 = group.quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers = group[(group < lower_bound) | (group > upper_bound)]
return len(outliers)
col_report['异常值数'] = data.groupby(group_col)[col].apply(detect_outliers)
# 数据完整性
total = data.groupby(group_col).size()
valid = data.groupby(group_col)[col].count()
col_report['数据完整率'] = (valid / total * 100).round(2)
report[col] = pd.DataFrame(col_report)
return report
# 生成验证报告
validation_report = generate_validation_report(
df_complex, '项目', ['预算', '实际支出']
)
print("数据分组验证报告:")
for column, report_df in validation_report.items():
print(f"\n列 '{column}' 验证报告:")
print(report_df)
自定义验证规则
class DataValidater:
def __init__(self, df):
self.df = df
self.validation_rules = []
self.results = {}
def add_rule(self, name, func):
"""添加自定义验证规则"""
self.validation_rules.append((name, func))
def validate_by_group(self, group_col):
"""按分组执行所有验证规则"""
for rule_name, rule_func in self.validation_rules:
self.results[rule_name] = self.df.groupby(
group_col
).apply(rule_func)
return pd.DataFrame(self.results)
def print_summary(self):
"""打印验证总结"""
for rule, result in self.results.items():
pass_count = result.sum()
fail_count = len(result) - pass_count
print(f"\n规则 '{rule}':")
print(f" 通过: {pass_count} 组")
print(f" 失败: {fail_count} 组")
if fail_count > 0:
print(f" 失败的组: {result[~result].index.tolist()}")
# 使用示例
validator = DataValidater(df_complex)
# 添加验证规则
validator.add_rule('预算未超支',
lambda x: x['实际支出'].sum() <= x['预算'].sum()
)
validator.add_rule('单阶段不超支',
lambda x: (x['实际支出'] <= x['预算']).all()
)
# 执行验证
results = validator.validate_by_group('项目')
print("自定义规则验证结果:")
print(results)
validator.print_summary()
这些案例涵盖了:
- 数据完整性验证
- 一致性验证
- 范围验证
- 多条件验证
- 报告生成
- 自定义规则
你可以根据实际需求选择合适的验证方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播