Python Pandas/SQL实现横向对比两系统交易商品并筛选无交集行
解决方案:筛选两系统商品无交集的交易行
我们需要筛选出系统A的商品集合与系统B的商品集合完全无交集的交易行,包含其中一方未捕获任何商品的场景。以下分别提供SQL和Python Pandas两种实现方案:
SQL 实现
思路
- 对每个交易行,分别提取系统A、B的非空商品集合
- 检查两个集合是否无交集(含其中一个集合为空的情况)
- 筛选出符合条件的交易记录
代码示例
假设数据表名为transaction_items,字段包含transaction_id, A_Item1, A_Item2, A_Item3, B_Item1, B_Item2, B_Item3:
SELECT transaction_id, A_Item1, A_Item2, A_Item3, B_Item1, B_Item2, B_Item3 FROM transaction_items WHERE -- 判断两系统非空商品无交集 NOT EXISTS ( SELECT item FROM (VALUES (A_Item1), (A_Item2), (A_Item3)) AS a_items(item) WHERE a_items.item IS NOT NULL INTERSECT SELECT item FROM (VALUES (B_Item1), (B_Item2), (B_Item3)) AS b_items(item) WHERE b_items.item IS NOT NULL );
逻辑说明
- 用
VALUES子句将各系统的3个商品列转为行数据,过滤空值后做交集运算 - 若交集为空(
NOT EXISTS),说明两系统无共同商品,自动覆盖以下场景:- 交易ID2:A的商品(bread)与B的商品(soup、egg)无重叠
- 交易ID5:B系统无任何商品,交集为空
- 交易ID1因两系统都有coffee,交集存在,会被排除
Python Pandas 实现
思路
- 对每行数据,分别收集系统A、B的非空商品,转化为集合
- 计算两个集合的交集,若交集为空则保留该行
- 输出符合条件的交易记录
代码示例
import pandas as pd # 模拟测试数据 data = { 'transaction_id': [1, 2, 5], 'A_Item1': ['coffee', 'bread', None], 'A_Item2': ['milk', None, None], 'A_Item3': [None, None, None], 'B_Item1': ['coffee', 'soup', None], 'B_Item2': ['tea', 'egg', None], 'B_Item3': [None, None, None] } df = pd.DataFrame(data) def check_no_intersection(row): # 提取系统A的非空商品集合 a_items = set(row[['A_Item1', 'A_Item2', 'A_Item3']].dropna()) # 提取系统B的非空商品集合 b_items = set(row[['B_Item1', 'B_Item2', 'B_Item3']].dropna()) # 判断交集是否为空 return len(a_items & b_items) == 0 # 筛选符合条件的行 result_df = df[df.apply(check_no_intersection, axis=1)] print(result_df)
输出结果
transaction_id A_Item1 A_Item2 A_Item3 B_Item1 B_Item2 B_Item3 1 2 bread None None soup egg None 2 5 None None None None None None
逻辑说明
- 用
dropna()过滤空值后转成集合,通过集合交集运算判断是否有共同商品 - 交集长度为0时,说明两系统无重叠商品,自动覆盖一方无商品的场景
- 交易ID1因集合交集包含coffee,会被过滤
内容的提问来源于stack exchange,提问作者user13617491
相关产品推荐
相关产品推荐

