Python批量分组零售银行交易的优化方法求助
优化零售银行客户交易分组的Python实现方案
兄弟,你之前用嵌套pd.np.where的方式确实太折磨人了——几千个商户的话,那代码得长到看不到头!完全可以用商户规则列表的方式来重构,不仅简洁,后期维护也方便太多了。
核心思路
把所有商户的匹配规则(关键词+目标分组名称)集中管理成一个列表,然后遍历每条交易记录去匹配规则,匹配到就返回对应分组,没匹配到就归为OTHER。
具体实现步骤
1. 定义商户匹配规则
先把所有需要匹配的关键词和对应的分组名称整理成元组列表,后续新增/修改商户只需要在这里调整,不用动逻辑代码:
# 定义商户匹配规则:(匹配关键词, 目标分组名称) merchant_rules = [ ("PNP ", "PICKNPAY"), ("CHECKERS", "CHECKERS"), ("MRPRICE", "MRPRICE"), ("FOOD LOVER", "FOODLOVERMARKET"), ("DISCHEM", "DISCHEM"), ("DIS-CHEM", "DISCHEM"), ("OK FOODS", "OKFOODS"), ("FASHION EXPRESS", "FASHIONEXPRESS"), ("MTC", "MTC"), ("TELECOM", "TELECOM"), ("KFC", "KFC"), ("ACKERMANS", "ACKERMANS"), ("SHOPRITE", "SHOPRITE"), ("USAVE", "SHOPRITE"), # USAVE归到SHOPRITE组 ("S/STATION", "SERVICESTATION"), ("SERVICE STATION", "SERVICESTATION"), ("SOULSTICE DAY SPA", "SOULSTICESPA"), ("CLICKS", "CLICKS"), ("JET ", "JET"), ("PEP ", "PEP"), ("WOERMANN", "WOERMANN") ]
2. 处理空值(和你之前的逻辑一致)
temp = tranx.TRANX.fillna("0")
3. 编写分类函数并应用
写一个简单的函数,遍历规则列表检查交易文本,返回对应的分组:
def categorize_transaction(tranx_text): for keyword, group in merchant_rules: if keyword in tranx_text: return group return "OTHER" # 将函数应用到整个交易文本列 tranx['Activity_2'] = temp.apply(categorize_transaction)
进阶优化:提升大数据集处理效率
如果你的交易数据量特别大,apply逐行处理可能会有点慢,这时候可以用正则表达式批量匹配,效率更高:
import re # 构建正则模式:优先匹配长关键词(避免短关键词提前匹配),用|分隔所有关键词 # 注意:如果有重叠关键词,要把长的放在规则列表前面 pattern = '|'.join([f'(?P<{group}>{re.escape(keyword)})' for keyword, group in merchant_rules]) # 提取匹配结果,取第一个非空的分组,最后填充OTHER tranx['Activity_2'] = temp.str.extract(pattern, flags=re.IGNORECASE).bfill(axis=1).iloc[:, 0].fillna("OTHER")
这种方式的优势
- 易维护:新增/修改商户规则只需要在
merchant_rules里加/改元组,不用动核心逻辑 - 可读性强:不像嵌套
np.where那样层层嵌套,逻辑一目了然 - 扩展性好:哪怕几千个商户,也只需要把规则整理成列表即可,不会让代码无限膨胀
内容的提问来源于stack exchange,提问作者Ligamena
相关产品推荐
相关产品推荐

