如何在 pandas 中匹配具有不同值的字符串?

How do you match strings with different values in pandas?

我正在尝试比较 2 个数据帧中的值。这是我的代码:

for i in df1['Searches']:
    for j in df['Tags']:
        if  i == j:
           print(i,j)   

代码有效。但是,我想考虑由于间距、拼写错误或标点符号而导致字符串不完全匹配的情况,但考虑到它们有多少共同点,它们应该匹配。

例如:

   Searches       |   Tags 
----------------------------------
   lightblue      |   light blue
   light-blue     |   light blue
   light blu      |   light blue
   lite blue      |   light blue
   liteblue       |   light blue
   liteblu        |   light blue
   light b l u e  |   light blue
   light.blue     |   light blue
   l i ght blue   |   light blue
  

我列出了可能出现在搜索下的可能字符串的变体,以及它应该匹配到标签下的字符串。有没有一种方法可以解释这些变化并仍然使它们匹配?

感谢您花时间阅读我的问题并尽您所能提供帮助。

您正在进入模糊字符串匹配。一种方法是使用相似性度量,例如自然语言工具包 (NLTK) 中的 jaro_similarity

from nltk.metrics.distance import jaro_similarity
df['jaro_similarity'] = df.apply(lambda row: jaro_similarity(row['Searches'], row['Tags']), axis=1)

结果:

     Searches       Tags  jaro_similarity
    lightblue light blue         0.966667
   light-blue light blue         0.933333
    light blu light blue         0.966667
    lite blue light blue         0.896296
     liteblue light blue         0.858333
      liteblu light blue         0.819048
light b l u e light blue         0.923077
   light.blue light blue         0.933333
 l i ght blue light blue         0.877778

您必须通过对数据进行试验来选择一个分界点。 nltk.metrics.distance 模块的文档:https://www.nltk.org/api/nltk.metrics.distance.html#module-nltk.metrics.distance

您可以使用字符串相似性度量来确定匹配。例如,这里我使用 nltk 库中的 edit_distance

import pandas as pd
from nltk.metrics.distance import edit_distance

searches = \
['lightblue',
 'light-blue',
 'light blu',
 'lite blue',
 'liteblue',
 'liteblu',
 'light b l u e',
 'light.blue',
 'l i ght blue',
 'totally different string'
]
df = pd.DataFrame()
df['Searches'] = searches
df['Tags'] = 'light blue'

matches = []
distance_threshold = 5
for i in df['Searches']:
    for j in df['Tags']:
        if  edit_distance(i, j) < distance_threshold:
            # print(i,j)  
            matches.append(i)
print(list(set(matches))) 

输出:

['light.blue',
 'light b l u e',
 'lightblue',
 'light blu',
 'light-blue',
 'lite blue',
 'l i ght blue',
 'liteblu',
 'liteblue']

但您必须根据自己的喜好调整 distance_threshold 或选择其他效果更好的指标。在此处查看指标列表:

https://www.nltk.org/api/nltk.metrics.distance.html

您还可以尝试许多其他库。只需搜索一下即可。