如何在pandas列中获得匹配值?



我想将pandas列中的列表与另一个正常列表进行比较,找到匹配值并将其放在另一个列中。

我有一个术语列表,想要查找是否有与特定单词

匹配的词
<表类>元tbody><<tr>[‘回家’,‘超市’,‘蛋糕’][‘回家’,‘超市’,‘饼干’,"奥利奥")
df = pd.DataFrame([
{"meta": ['Home', 'grocery', 'cake']},
{"meta": ['Home', 'grocery', 'Biscuit', 'Oreo']}
])
terms = ['cake', 'biscuit']
df["match_value"] = df["meta"].apply(lambda row: list(set(map(str.lower, row)).intersection(set(terms))))

你可以使用regex模式在爆炸列表后提取子字符串:

import re
pattern = re.compile(f"({'|'.join(terms)})", re.IGNORECASE)
df['match value'] = (df['meta'].explode().str.extractall(pattern)[0]
.groupby(level=0).agg(list)
df['result'] = df['match value'].str.len().astype(bool)

输出:

>>> df
meta   match value  result
0  [Home, grocery, cake, biscuit]        [cake]    True
1  [Home, grocery, Biscuit, Oreo]     [Biscuit]    True

我们使用爆炸与矢量字符串匹配

exploded = df['meta'].explode().str.lower()
df['match'] = exploded[exploded.isin(terms)].groupby(level=0).agg(list)
df['result'] = df['match'].str.len() > 0

为了获得最佳结果,确保terms中的术语也小写。


让我们尝试另一组术语来看看它是如何工作的

terms = ['home', 'biscuit']
exploded = df['meta'].explode().str.lower()
df['match'] = exploded[exploded.isin(terms)].groupby(level=0).agg(list)
df['result'] = df['match'].str.len() > 0
df

meta            match  result
0           [Home, grocery, cake]           [home]    True
1  [Home, grocery, Biscuit, Oreo]  [home, biscuit]    True

最新更新