Python案例如何用Pandas做数据分组验证

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据分组验证

  1. 基础分组验证
  2. 数据一致性验证
  3. 数据范围和边界验证
  4. 多条件分组验证
  5. 数据分组验证报告
  6. 自定义验证规则

我来介绍几个用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()

这些案例涵盖了:

  • 数据完整性验证
  • 一致性验证
  • 范围验证
  • 多条件验证
  • 报告生成
  • 自定义规则

你可以根据实际需求选择合适的验证方式。

抱歉,评论功能暂时关闭!