You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,结果不一致

问题原因

  1. 集合转列表的无序性:set(['IN','OUT'])转为列表时,在Python3.6及以下版本中顺序完全随机;即使在3.7+版本中,若集合创建逻辑有变化,列表顺序也可能波动。process.extractOne会按候选列表的顺序处理匹配。
  2. 相似度得分相同导致随机返回:当目标字符串(如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:35:23