我有一个名为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值为空)。
由于
答案 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项