Python新手求助:基于关键词匹配为费用DataFrame填充分类与子分类
高效实现关键词匹配填充分类
步骤1:准备测试数据
先还原你的示例数据,方便直接运行测试:
import pandas as pd # 支出数据DataFrame expense = pd.DataFrame({ 'Date': ['01/01/22', '04/09/22', '01/10/22', '04/11/22'], 'Libellé': ['CB Darty xxxxxx', 'CB Restau Macdo xxx', 'VIR SALAIRE MOMO xxxx', 'VIR TUTU'], 'Prix': [100, 10, 10000000, 100], 'Catégorie': ['?', '?', '?', '?'], 'Sous-catégorie': ['?', '?', '?', '?'] }) # 关键词-分类映射表DataFrame keyword_df = pd.DataFrame({ 'Catégorie': ['Courant', 'Courant', 'Pro'], 'Sous-catégorie': ['Alimentation', 'Loisirs', 'Revenus'], 'Keyword': ['Macdo, KFC, Burger_King', 'Darty, UGC, Pathé', 'Salaire, Momo'] })
步骤2:预处理关键词表
原映射表一行对应多个关键词,先拆成每行一个关键词,便于后续精准映射:
# 拆分逗号分隔的关键词,每个关键词单独成一行 keyword_df = keyword_df.assign(Keyword=keyword_df['Keyword'].str.split(', ')).explode('Keyword')
处理后keyword_df的结构:
| Catégorie | Sous-catégorie | Keyword |
|---|---|---|
| Courant | Alimentation | Macdo |
| Courant | Alimentation | KFC |
| Courant | Alimentation | Burger_King |
| Courant | Loisirs | Darty |
| Courant | Loisirs | UGC |
| Courant | Loisirs | Pathé |
| Pro | Revenus | Salaire |
| Pro | Revenus | Momo |
步骤3:矢量化匹配填充分类(替代低效循环)
用pandas的矢量化操作批量处理,比Python逐行循环效率高一个数量级:
# 1. 构建关键词到分类、子分类的映射字典 cat_map = keyword_df.set_index('Keyword')['Catégorie'].to_dict() subcat_map = keyword_df.set_index('Keyword')['Sous-catégorie'].to_dict() # 2. 构建正则匹配模式(转小写避免大小写不匹配问题) pattern = '|'.join(keyword_df['Keyword'].str.lower()) # 3. 从支出描述中提取匹配的关键词 expense['matched_keyword'] = expense['Libellé'].str.lower().str.extract(f'({pattern})', expand=False) # 4. 映射填充分类和子分类,未匹配到的保持原'?' expense['Catégorie'] = expense['matched_keyword'].map(cat_map).fillna('?') expense['Sous-catégorie'] = expense['matched_keyword'].map(subcat_map).fillna('?') # 可选:删除临时生成的匹配关键词列 expense = expense.drop('matched_keyword', axis=1)
最终效果
处理后的expense数据:
| Date | Libellé | Prix | Catégorie | Sous-catégorie |
|---|---|---|---|---|
| 01/01/22 | CB Darty xxxxxx | 100 | Courant | Loisirs |
| 04/09/22 | CB Restau Macdo xxx | 10 | Courant | Alimentation |
| 01/10/22 | VIR SALAIRE MOMO xxxx | 10000000 | Pro | Revenus |
| 04/11/22 | VIR TUTU | 100 | ? | ? |
效率说明
pandas矢量化操作基于numpy底层实现,直接对整列数据批量处理,避免了Python层面逐行循环的开销,数据量越大,效率提升越明显。
内容的提问来源于stack exchange,提问作者user23156049
相关产品推荐
相关产品推荐

