匹配nan值的模糊匹配问题

时间:2017-10-30 17:14:32

标签: python pandas

我有一个名为RawDatabase的数据框,我正在将值捕捉到名为ValidationLists的验证列表中。我从RawDatabase中获取一个特定的列,并将这些元素与验证列表进行比较。该条目将被捕捉到最接近类似的验证列表中的条目。代码如下所示:

def GetStandardisedField(rawDatabase,validationLists,field):
print('Standardising ', field,' ...')

my_list = validationLists[field]

l1=[]

for x in rawDatabase[field]:

    choice = process.extractOne(x, my_list)[0]
    l1.append(choice)

rawDatabase['choice']=l1
rawDatabase[field] = rawDatabase['choice']
del rawDatabase['choice']

return rawDatabase 

在示例中,rawDatabase [field]如下所示:

0       yes
1    YES123
2     nO023
3         n
4       NaN

并且validationList看起来像:

YES
NO

我试图捕捉所有值,以便新的rawDatabase [字段]看起来像:

0       YES
1       YES
2        NO
3        NO
4       

当我尝试将NaN值与validationList对齐时,我似乎遇到了问题(即使我在NaN中加入了validationList(作为测试) )。

有人可以告诉我处理NaN值的最佳方法(因此捕捉的数据集中的NaN值为空)。

由于

2 个答案:

答案 0 :(得分:1)

from fuzzywuzzy import process
l=['YES',"NO"]
a=[]
for x in df.Col1:
    try:
        a.append([process.extract(x, l, limit=1)][0][0][0])
    except:
        a.append(np.nan)

df['target']=a
df
Out[1261]: 
     Col1 target
0     yes    YES
1  YES123    YES
2   nO023     NO
3       n     NO
4     NaN    NaN

答案 1 :(得分:0)

我喜欢这种类型的python difflib

您可以使用get_close_matches

获取字符串匹配项
from difflib import get_close_matches
foo = pd.Series(('yes', 'YES123', 'nO023', 'nO023', 'n', np.nan))
validation_list = ['YES', 'NO']

def get_matches(x):
    if pd.isnull(x):
        return np.nan
    else:
        return get_close_matches(str(x).upper(), validation_list, 1, 0.2)[0]

foo.apply(get_matches)

0    YES
1    YES
2     NO
3     NO
4    NaN

get_close_matches获取您要测试的值,要测试的列表,要返回的匹配数以及匹配为了返回它所需的相似度的阈值。返回类型是一个列表,因此只需获取该列表中的第0项

相关问题