繁体   English   中英

从 dataframe 列获取最相似的值到特定字符串 python

[英]Get most similar value from dataframe column to specific string python

我想从 dataframe 列中找到与指定字符串最相似的值,例如a='book' 假设 dataframe 看起来像: df

col1
wijk 00 book
Wijk a 
test

现在我想返回wijk 00 book ,因为这a . 我正在尝试使用模糊的fuzzywuzzy来做到这一点。

因此,我有一个 dataframe A的值,我想要一个类似的值。 然后我使用:

A['similar_value'] = A.col1.apply(lambda x: [process.extract(x, df.col1, limit=1)][0][0][0])  

但是当比较很多字符串时,这会花费太多时间。 有谁知道如何快速做到这一点?

我会使用rapidfuzz

from rapidfuzz import process, fuzz

df = pd.DataFrame(['wijk 00 book', 'Wijk a', 'test'], columns=['col1'])

search_str = 'book'
most_similar = process.extractOne(search_str, df['col1'], scorer=fuzz.WRatio)

Output:

most_similar
('wijk 00 book', 90.0, 0)

这会为您提供列中最相似的字符串以及它与您的搜索字符串的相似程度的分数。

您可以使用“str.contains”方法获取与 substring 完全相同的字符串

df[df["column_name"].str.contains("book")].values[0][0]

尝试fuzz.ratio()Series.idxmax() 这将针对a定位具有最高模糊分数的col1值:

from rapidfuzz import fuzz

a = 'book'
df.loc[df.col1.apply(lambda x: fuzz.ratio(x, a)).idxmax()]

# col1    wijk 00 book
# Name: 0, dtype: object

更新: @lolliesaurusprocess.extractOne()方法更快:

>>> %timeit process.extractOne(a, df.col1, scorer=fuzz.WRatio)
11.6 µs ± 180 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

>>> %timeit df.loc[df.col1.apply(lambda x: fuzz.ratio(x, a)).idxmax()]
353 µs ± 3.45 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM