process.extractOne匹配CallType结果不一致的问题排查与优化
Pandas中CallType列映射的不稳定问题排查与优化方案
问题场景
现有如下Pandas DataFrame:
Name CallType Location ABC IN SFO DEF OUT LHR PQR INCOMING AMS XYZ OUTGOING BOM TYR A_IN DEL OMN A_OUT DXB
需要将CallType列的所有值映射到{'IN','OUT'}集合,期望结果:
Name CallType Location ABC IN SFO DEF OUT LHR PQR IN AMS XYZ OUT BOM TYR IN DEL OMN OUT DXB
使用process.extractOne(fuzzywuzzy库)实现时出现不稳定现象:OUTGOING有时被正确匹配为OUT,有时错误匹配为IN,代码如下:
data=[('ABC','IN','SFO'), ('DEF','OUT','LHR'), ('PQR','INCOMING','AMS'), ('XYZ','OUTGOING','BOM'), ('TYR','A_IN','DEL'), ('OMN','A_OUT','DXB')] df = pd.DataFrame(data, columns =['Name', 'CallType', 'Location']) call_types=set(['IN','OUT']) df['CallType'] = df['CallType'].apply(lambda x: process.extractOne(x, list(call_types))[0]) total_rows=len(df) for row_no in range(total_rows): row=df.iloc[row_no] print(row) # 此处OUTGOING有时为OUT,有时为IN,结果不一致
问题原因
- 集合转列表的无序性:
set(['IN','OUT'])转为列表时,在Python3.6及以下版本中顺序完全随机;即使在3.7+版本中,若集合创建逻辑有变化,列表顺序也可能波动。process.extractOne会按候选列表的顺序处理匹配。 - 相似度得分相同导致随机返回:当目标字符串(如
OUTGOING)与IN、OUT的模糊匹配得分完全相同时,process.extractOne会返回候选列表中的第一个元素。由于列表顺序不稳定,最终结果会随机切换。
最优实现方案
由于所有待映射的CallType值都明确包含IN或OUT,不需要模糊匹配,直接通过字符串包含判断即可实现稳定、高效的映射:
方法1:向量化字符串判断(推荐,效率最高)
import pandas as pd import numpy as np data=[('ABC','IN','SFO'), ('DEF','OUT','LHR'), ('PQR','INCOMING','AMS'), ('XYZ','OUTGOING','BOM'), ('TYR','A_IN','DEL'), ('OMN','A_OUT','DXB')] df = pd.DataFrame(data, columns=['Name', 'CallType', 'Location']) # 利用向量化操作判断字符串是否包含IN,是则映射为IN,否则为OUT df['CallType'] = np.where(df['CallType'].str.contains('IN'), 'IN', 'OUT') print(df)
方法2:简单lambda映射
df['CallType'] = df['CallType'].apply(lambda x: 'IN' if 'IN' in x else 'OUT')
方法3:正则表达式提取(适合复杂模式)
如果需要确保IN/OUT是独立的子串(避免误匹配类似WIN的情况),可以用正则:
import re df['CallType'] = df['CallType'].apply(lambda x: re.search(r'\b(IN|OUT)\b', x).group(1))
内容的提问来源于stack exchange,提问作者arpit joshi
相关产品推荐
相关产品推荐

