在Pandas数据帧中查找多个字典键并返回多个匹配值

2024-09-26 18:03:03 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我的格式被关闭了,那么第一次发帖会提前道歉。在

我的问题是:

我创建了一个包含多行文本的Pandas数据框:

d = {'keywords' :['cheap shoes', 'luxury shoes', 'cheap hiking shoes']}
keywords = pd.DataFrame(d,columns=['keywords'])
In [7]: keywords
Out[7]:
        keywords
0  cheap shoes
1  luxury shoes
2  cheap hiking shoes

现在我有一个包含以下键/值的字典:

^{pr2}$

我想做的是找出字典中的键是否存在于数据帧中,如果存在,则返回适当的值

我可以通过以下方法达到目的:

for k,v in labels.items():
   keywords['Labels'] = np.where(keywords['keywords'].str.contains(k),v,'No Match')

但是,输出缺少前两个键,只捕获最后一个“徒步”键

    keywords            Labels
0   cheap shoes         No Match
1   luxury shoes        No Match
2   cheap hiking shoes  sport

另外,我还想知道是否有办法在字典中捕捉以|分隔的多个值,因此理想的输出应该如下所示

    keywords            Labels
0   cheap shoes         budget
1   luxury shoes        expensive
2   cheap hiking shoes  budget | sport

任何帮助或指导都将不胜感激。在

干杯


Tags: 数据no文本labels字典格式matchbudget
3条回答

您可以使用"|".join(labels.keys())获得{}使用的模式。在

import pandas as pd
import re

d = {'keywords' :['cheap shoes', 'luxury shoes', 'cheap hiking shoes']}
keywords = pd.DataFrame(d,columns=['keywords'])
labels = {'cheap' : 'budget', 'luxury' : 'expensive', 'hiking' : 'sport'}
pattern = "|".join(labels.keys())

def f(s):
    return "|".join(labels[word] for word in re.findall(pattern, s))

keywords.keywords.map(f)

当然有可能。有一种方法。在

d = {'keywords': ['cheap shoes', 'luxury shoes', 'cheap hiking shoes', 'nothing']}

keywords = pd.DataFrame(d,columns=['keywords'])

labels = {'cheap': 'budget', 'luxury': 'expensive', 'hiking': 'sport'}

df = pd.DataFrame(d)

def matcher(k):
    x = (i for i in labels if i in k)
    return ' | '.join(map(labels.get, x))

df['values'] = df['keywords'].map(matcher)

#              keywords          values
# 0         cheap shoes          budget
# 1        luxury shoes       expensive
# 2  cheap hiking shoes  budget | sport
# 3             nothing                

坚持你的方法,你可以这样做

arr = np.array([np.where(keywords['keywords'].str.contains(k), v, 'No Match') for k, v in labels.items()]).T
keywords["Labels"] = ["|".join(set(item[ind if ind.sum() == ind.shape[0] else ~ind])) for item, ind in zip(arr, (arr == "No Match"))]

Out[97]: 
             keywords        Labels
0         cheap shoes        budget
1        luxury shoes     expensive
2  cheap hiking shoes  sport|budget

相关问题 更多 >

    热门问题