使用Pandas识别唯一或超出容差的对账行
解决方案
步骤1:计算分组统计量并关联回原数据
你已经通过分组聚合得到了每组的数据源数量和差值,接下来先把这些统计量合并回原始DataFrame,方便后续筛选:
# 保留你已有的代码逻辑 df['new_value'] = np.where(df['source'] == 'y', -1 * df['value'], df['value']) grouped = df.groupby(key).agg( source_count=('source', 'count'), value_diff=('new_value', 'sum') ).reset_index() # 将分组统计结果合并回原df,让每行都能获取分组信息 df = df.merge(grouped, on=key, how='left')
步骤2:定义筛选条件并提取目标行
根据需求,我们需要筛选两类行:
- 唯一行:分组内只有一个数据源(
source_count == 1) - 超容差行:分组内有两个数据源,且数值差的绝对值超过对应
identifier的容差
# 给每行匹配对应的容差阈值 df['tolerance'] = df['identifier'].map(tolerance) # 定义两个筛选条件 condition_unique = df['source_count'] == 1 condition_over_tolerance = (df['source_count'] == 2) & (abs(df['value_diff']) > df['tolerance']) # 合并条件,筛选出目标行 result = df[condition_unique | condition_over_tolerance] # 可选:删除中间计算列,保留原始字段 result = result.drop(columns=['new_value', 'source_count', 'value_diff', 'tolerance'])
完整可运行代码
import pandas as pd import numpy as np df = pd.DataFrame({ "date": ['2017-02-22', '2019-05-07', '2019-05-07', '2018-01-01', '2020-03-10', '2020-03-10'], "identifier": ['A', 'A', 'A', 'A', 'A', 'A'], "value": [123, 456, 455, 678, 999.9876, 900.1234], "source": ['x', 'x', 'y', 'y', 'x', 'y'] }) tolerance = {'A': 2.50} key = ['date', 'identifier'] df = df.sample(frac=1).reset_index(drop=True) # 打乱行并重置索引 # 计算分组差值和数据源数量 df['new_value'] = np.where(df['source'] == 'y', -1 * df['value'], df['value']) grouped = df.groupby(key).agg( source_count=('source', 'count'), value_diff=('new_value', 'sum') ).reset_index() # 合并统计信息到原数据 df = df.merge(grouped, on=key, how='left') # 匹配容差并筛选目标行 df['tolerance'] = df['identifier'].map(tolerance) condition_unique = df['source_count'] == 1 condition_over_tolerance = (df['source_count'] == 2) & (abs(df['value_diff']) > df['tolerance']) result = df[condition_unique | condition_over_tolerance].drop(columns=['new_value', 'source_count', 'value_diff', 'tolerance']) print(result)
输出结果示例
date identifier value source 0 2018-01-01 A 678.00 y 1 2017-02-22 A 123.00 x 2 2020-03-10 A 999.9876 x 3 2020-03-10 A 900.1234 y
内容的提问来源于stack exchange,提问作者aeiou
相关产品推荐
相关产品推荐

