如何在 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
您还可以尝试许多其他库。只需搜索一下即可。
我正在尝试比较 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
您还可以尝试许多其他库。只需搜索一下即可。