You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:25:26