基于两列匹配计算同列两行差值的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)
代码细节解释
- 映射构建:将
Tag作为索引存储对应行的Id和Amount,避免循环遍历,提升匹配效率 - 双向校验:确保两组行是互相匹配的(A的Id=B的Tag且B的Id=A的Tag),排除误匹配
- 差值规则:严格遵循
Id较大行的Amount减去较小行的Amount的要求 - 灵活适配:非匹配行的返回值可直接修改,满足填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
相关产品推荐
相关产品推荐

