Python/SQL对比两数据集列:匹配姓氏/银行账户与付款描述
需求说明
现有两个数据集:
- 数据集1(表名
user):包含firstName、lastName、email、bankaccount列 - 数据集2(表名
book):包含银行详情描述列description,格式示例:"NLXXRABOXXXXXXXXXX XXXXXXXXXXXXX firstName lastName date"
需要判断book.description中是否存在对应user的lastName或bankaccount,以此验证用户是否完成付款。当前已将两个数据集导入Pandas和SQL环境,尝试的SQL语句无法实现批量匹配,现提供可行的SQL和Pandas实现方案。
SQL 实现方案
方案1:用 EXISTS 子查询做批量匹配
通过EXISTS子查询,逐个检查每个用户的lastName或bankaccount是否出现在任意一条book的描述中,返回匹配成功的用户邮箱:
SELECT u.email FROM user u WHERE EXISTS ( SELECT 1 FROM book b WHERE b.description LIKE CONCAT('%', u.lastName, '%') OR b.description LIKE CONCAT('%', u.bankaccount, '%') );
方案2:用 JOIN 关联查询(可返回匹配的描述)
如果需要同时查看匹配到的描述内容,用JOIN关联两张表,再通过DISTINCT去重同一用户的重复匹配结果:
SELECT DISTINCT u.email, b.description FROM user u JOIN book b ON b.description LIKE CONCAT('%', u.lastName, '%') OR b.description LIKE CONCAT('%', u.bankaccount, '%');
Pandas 实现方案
假设用户表的DataFrame是df_user,银行描述表是df_book,提供两种实现方式:
方案1:遍历用户逐一匹配(高效处理750行描述)
import pandas as pd matched_emails = [] # 遍历每个用户记录 for _, user in df_user.iterrows(): # 检查描述列是否包含该用户的lastName或bankaccount match_flag = df_book['description'].str.contains( f"{user['lastName']}|{user['bankaccount']}", case=False # 忽略大小写,不需要的话可以删掉这个参数 ).any() if match_flag: matched_emails.append(user['email']) # 去重后生成结果DataFrame result = pd.DataFrame({'verified_email': list(set(matched_emails))})
方案2:交叉合并后筛选(适合小体量用户表)
如果用户表行数不多,可以先做交叉连接,再筛选匹配的记录:
# 交叉连接两张表 cross_join = df_user.assign(temp_key=1).merge(df_book.assign(temp_key=1), on='temp_key').drop('temp_key', axis=1) # 筛选出描述包含lastName或bankaccount的记录 matched_records = cross_join[ cross_join['description'].str.contains(cross_join['lastName'], case=False) | cross_join['description'].str.contains(cross_join['bankaccount'], case=False) ] # 提取唯一的验证通过邮箱 result = matched_records[['email']].drop_duplicates()
内容的提问来源于stack exchange,提问作者Floor
相关产品推荐
相关产品推荐

