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

基于两列匹配计算同列两行差值的Python脚本开发需求

解决VAT拆分的交易数据差值计算问题

核心逻辑说明

针对含Id、Tag、Amount的交易表格,实现以下逻辑:

  • 匹配条件:当某行的Id等于另一行的Tag,且另一行的Id等于当前行的Tag时,视为一组有效匹配交易
  • 差值计算:取匹配组中Id较大的行的Amount,减去Id较小的行的Amount
  • 非匹配行:统一填充NaN(可根据需求改为0或原Amount)

实现代码

import pandas as pd

# 替换为你的实际数据读取方式(如pd.read_csv/Excel)
data = {
    'Id': [101, 102, 103, 104, 105],
    'Tag': [102, 101, 106, 105, 104],
    'Amount': [1000, 800, 500, 300, 200]
}
df = pd.DataFrame(data)

# 构建Tag到对应行数据的映射,用于快速匹配
tag_mapping = df.set_index('Tag')[['Id', 'Amount']].to_dict('index')

# 定义计算新列的逻辑
def compute_diff(row):
    # 检查当前行Id是否能找到匹配的Tag行
    if row['Id'] in tag_mapping:
        matched_data = tag_mapping[row['Id']]
        # 双向校验:确保是成对匹配,避免单向无效关联
        if matched_data['Id'] == row['Tag']:
            # 根据Id大小计算差值
            if row['Id'] > matched_data['Id']:
                return row['Amount'] - matched_data['Amount']
            else:
                return matched_data['Amount'] - row['Amount']
    # 非匹配场景返回NaN,可修改为0或row['Amount']
    return pd.NA

# 生成新列
df['NewColumn'] = df.apply(compute_diff, axis=1)

print(df)

代码细节解释

  1. 映射构建:将Tag作为索引存储对应行的Id和Amount,避免循环遍历,提升匹配效率
  2. 双向校验:确保两组行是互相匹配的(A的Id=B的Tag且B的Id=A的Tag),排除误匹配
  3. 差值规则:严格遵循Id较大行的Amount减去较小行的Amount的要求
  4. 灵活适配:非匹配行的返回值可直接修改,满足填0或原数值的需求

测试输出示例

运行上述代码后,示例数据的输出结果如下:

Id  Tag  Amount  NewColumn
0  101  102    1000      -200.0
1  102  101     800       200.0
2  103  106     500        <NA>
3  104  105     300       100.0
4  105  104     200      -100.0

内容的提问来源于stack exchange,提问作者MaxP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:39:24