列表字典中子串反向查找实现DataFrame支付交易自动分类
支付交易DataFrame收款方分类Python实现方案
实现代码
首先基于Pandas原生方法实现需求,性能优异且符合Python风格:
import pandas as pd import numpy as np # 构造示例测试数据,实际使用时替换为你的DataFrame即可 df = pd.DataFrame({ 'beneficiary': [ 'REWE SAGT DANKE. ...', np.nan, 'OBI BAU- U. HEIMWER//BERLIN/DE / OBI SAGT DANKE', 'NETFLIX INTERNATIONAL B.V.' ] }, index=[12,13,14,15]) # 你的分类字典 categories = {"Groceries": ["EDEKA", "REWE", "OBI"], "Entertainment": ["NETFLIX"]} # 初始化分类列为空 df['category'] = pd.NA # 遍历分类字典完成匹配 for cate, keywords in categories.items(): # 多个关键词拼接为正则匹配规则 pattern = '|'.join(keywords) # 匹配规则:收款方包含关键词、且还未分配分类、NaN值默认不匹配 match_mask = df['beneficiary'].str.contains(pattern, na=False) & df['category'].isna() df.loc[match_mask, 'category'] = cate
运行后输出的df完全符合预期结果:
| index | beneficiary | category |
|---|---|---|
| 12 | REWE SAGT DANKE. ... | Groceries |
| 13 | NaN | |
| 14 | OBI BAU- U. HEIMWER//BERLIN/DE / OBI SAGT DANKE | Groceries |
| 15 | NETFLIX INTERNATIONAL B.V. | Entertainment |
方案说明
- 匹配默认大小写敏感,若需要忽略大小写可在
str.contains方法中添加case=False参数 na=False参数指定NaN值的匹配结果返回False,避免触发空值报错- 代码逻辑默认先出现的分类优先级更高,若需调整优先级只需修改
categories字典中键的排列顺序即可 - 若关键词量级过万导致正则匹配效率低,可以替换为Aho-Corasick多模式匹配算法优化性能
内容的提问来源于stack exchange,提问作者cc 3445
相关产品推荐
相关产品推荐

