【问题标题】:Fuzzy matching issue with matching nan values匹配 nan 值的模糊匹配问题
【发布时间】:2017-10-30 17:14:31
【问题描述】:

我有一个名为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[field] 看起来像:

0       YES
1       YES
2        NO
3        NO
4       

然而,当我尝试将NaN 值捕捉到validationList 时,我似乎遇到了问题(即使我在validationList 中包含NaN(作为测试)。

谁能告诉我处理 NaN 值的最佳方法(所以捕捉数据集中的 NaN 值是空白的)。

谢谢

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      我喜欢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 项

      【讨论】:

        猜你喜欢
        • 2016-02-11
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        • 2016-10-24
        相关资源
        最近更新 更多