如何用Pandas检查不匹配记录并生成Match标记列?
Pandas实现集装箱号关联下的金额匹配逻辑
嘿,这个需求其实很适合用Pandas的合并操作+条件判断来实现,我帮你拆解成具体步骤,结合你给的示例数据来演示:
步骤1:导入依赖并创建示例数据
先把基础的环境和测试数据准备好:
import pandas as pd # 创建示例df1 df1 = pd.DataFrame({'Cntr_No': ['HLBU 1234567'], 'Total_Amount': [100]}) # 创建示例df2 df2 = pd.DataFrame({'Cntr_No': ['HLBU 1234567'], 'Total_Amount': [50], 'Amount_2': [40], 'Amount_3': [100]})
步骤2:按集装箱号合并两个DataFrame
我们需要把两个表通过Cntr_No关联起来,这样才能逐行比对金额:
# 按Cntr_No进行内连接(只保留两边都有的集装箱号) merged_df = pd.merge(df1, df2, on='Cntr_No', suffixes=('_df1', '_df2'))
这里用suffixes是为了区分两个表中同名的Total_Amount字段,避免字段名冲突。
步骤3:编写匹配逻辑生成Match列
接下来就是核心的条件判断了:
- 首先判断df1的
Total_Amount是否等于df2的Total_Amount - 如果不等,再检查是否等于df2的
Amount_2或者Amount_3 - 满足任一条件就标记为"Yes",否则为"No"
这里推荐用numpy.where实现,相比apply效率更高(尤其是大数据量场景):
import numpy as np # 构建匹配条件:满足任一规则即匹配成功 match_condition = (merged_df['Total_Amount_df1'] == merged_df['Total_Amount_df2']) | \ (merged_df['Total_Amount_df1'] == merged_df['Amount_2']) | \ (merged_df['Total_Amount_df1'] == merged_df['Amount_3']) # 生成Match列 merged_df['Match'] = np.where(match_condition, 'Yes', 'No')
步骤4:查看最终结果
执行完上面的代码后,merged_df的输出结果为:
Cntr_No Total_Amount_df1 Total_Amount_df2 Amount_2 Amount_3 Match 0 HLBU 1234567 100 50 40 100 Yes
完全符合你的需求——df1的100虽然不等于df2的Total_Amount(50),但匹配上了df2的Amount_3,所以标记为"Yes"。
额外优化(可选)
如果需要保留df1的原始结构,最后可以把Match列合并回df1:
df1 = df1.merge(merged_df[['Cntr_No', 'Match']], on='Cntr_No', how='left')
内容的提问来源于stack exchange,提问作者okl
相关产品推荐
相关产品推荐

