我有一個將 DF1 中的 ID 匹配到 DF2 的腳本,在某些情況下,匹配是通過將 DF1 中的字串作為子字串匹配到 DF2 來完成的。
例如: DF1 ID: 2abc1 DF2 ID: 32abc13d
上述情況下的匹配是2abc1(兩種情況下的公共字串)。盡管這種匹配方法適用于我的大部分資料,但在某些情況下,常見匹配只包含 2-3 個字串。
例如: DF1 ID: 10abe DF2 ID: 3210c13d
這里最長的共同匹配是"10"。
我想弄清楚的是這個匹配不正確的概率?我正在用python進行所有計算,所以我希望可能有一個庫來解決這個問題?
謝謝
uj5u.com熱心網友回復:
我不確定我是否遵循您的問題,以及這是否是您正在尋找的。正如您在評論中提到的,如果您想了解更多資訊,我們可以使用fuzzywuzzy 包,這里有一個鏈接。
https://towardsdatascience.com/string-comparison-is-easy-with-fuzzywuzzy-library-611cc1888d97
FuzzyWuzzy 適用于 Levenshtein 距離: https ://en.wikipedia.org/wiki/Levenshtein_distance
在您的情況下,您將需要執行類似的操作。
首先,我生成了一些資料,不確定您的條目,在示例中,鍵表示字串,值表示索引
DF1_ID = {"2abc1": 1, "qsdf5": 2, "df5": 3, "qdqsdf5": 4, "13dab": 5}
DF2_ID = {"32abc13d": 1, "az9qsdf5": 2, "aqsdf5": 3, "3213dabc": 4}
Fuzzuwuzzy 使用起來并不復雜。我認為與此類似的東西應該有效。
在 for 回圈中,將 DF1_ID 的鍵與 DF2_ID 的所有鍵進行比較,并輸出最高匹配。
變數out是匹配和從 0 到 100 的概率,然后我們可以設定最小值來分配字串,在我們的示例中是 90
注意limit=1回傳與具有最高相似性的值等效的輸出,如果不是,您將獲得 DF2_ID 鍵的元組串列和相應的相似性。
from fuzzywuzzy import process
mapper = {}
for val in DF1_ID.keys():
out = process.extract(val, DF2_ID.keys(), limit=1)[0]
print(val, ": Similarity -->", out)
if out[1] >= 90:
mapper[val] = DF2_ID[out[0]]
else:
mapper[val] = None
print(mapper)
輸出
2abc1 : Similarity --> ('32abc13d', 90)
qsdf5 : Similarity --> ('aqsdf5', 91)
df5 : Similarity --> ('az9qsdf5', 90)
qdqsdf5 : Similarity --> ('aqsdf5', 77)
13dab : Similarity --> ('3213dabc', 90)
{'2abc1': 1, 'qsdf5': 3, 'df5': 2, 'qdqsdf5': None, '13dab': 4}
映射器字典將 DF1_ID 的鍵映射到 DF2_ID 的索引,如果與 DF2_ID 的鍵的相似度高于 90
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/507886.html
上一篇:如何翻轉一個矩形?
