将字典中的单词 'Keys' 精确匹配到 Pandas DataFrame 列和 return 适当的值
Exact Match Words 'Keys' in a Dictionary to Pandas DataFrame Column & return appropriate value
只是想先说明一下,这个问题是从我之前的一个问题演变而来的,可以找到 。我有一些后续行动最终改变了原来的问题所以我们在这里..
假设我们有以下数据框:
d = {'keywords' :['cheapest cheap shoes', 'luxury shoes', 'cheap hiking shoes','liverpool']}
keywords = pd.DataFrame(d,columns=['keywords'])
In [7]: keywords
Out[7]:
keywords
0 cheapest cheap shoes
1 luxury shoes
2 cheap hiking shoes
3 liverpool
然后创建一个字典,其中包含我想与 DataFrame 中的值匹配的关键字
labels = {'cheape' : 'budget', 'cheap' : 'budget', 'luxury' : 'expensive',
'hiking' : 'sport', 'pool': 'pool'}
提供给我的原始答案帮助解决了字典中匹配键的问题
d = {'keywords' :['cheapest cheap shoes', 'luxury shoes', 'cheap hiking
shoes','liverpool']}
keywords = pd.DataFrame(d,columns=['keywords'])
labels = {'cheape' : 'budget', 'cheap' : 'budget', 'luxury' :
'expensive','hiking' : 'sport', 'pool': 'pool'}
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 cheapest cheap shoes budget | budget
1 luxury shoes expensive
2 cheap hiking shoes budget | sport
3 liverpool pool
但是,我 运行 遇到了部分匹配产生的匹配问题。在上面的输出中,请注意 cheape 将如何匹配 "cheapest" 以及 pool 将如何匹配 "liverpool"
所以我的问题是:有没有办法让我的字典与关键字中的值完全匹配,从而跳过部分匹配?
我想要的结果是:
keywords values
0 cheapest cheap shoes budget
1 luxury shoes expensive
2 cheap hiking shoes budget | sport
3 liverpool N/A
旁注 - 字典将扩展以包含与相同值相关联的键。这是为了捕获任何拼写变体或拼写错误,例如{'car' : 'Automobile', 'cars' : 'Automobile', 'carss' : 'Automobile'}
这就是为什么我想要完全匹配以防止出现任何重复/不相关的值。
干杯
试试这个:
df['values'] = (df['keywords']
.str.split(expand=True)
.apply(lambda x: x.map(labels).add(' | ').fillna(''))
.sum(axis=1)
.str.rstrip(' | ')
.replace('', 'N/A'))
结果:
In [60]: df
Out[60]:
keywords values
0 cheapest cheap shoes budget
1 luxury shoes expensive
2 cheap hiking shoes budget | sport
3 liverpool N/A
这是一个符合我第一个的解决方案。 str.split(' ')
用空格分割字符串。
import pandas as pd
d = {'keywords' :['cheapest cheap shoes', 'luxury shoes',
'cheap hiking shoes', 'liverpool']}
keywords = pd.DataFrame(d, columns=['keywords'])
labels = {'cheape': 'budget', 'cheap': 'budget', 'luxury': 'expensive',
'hiking': 'sport', 'pool':'pool'}
df = pd.DataFrame(d)
def matcher(k):
x = (i for i in labels if i in k.split(' '))
return ' | '.join(map(labels.get, x))
df['values'] = df['keywords'].map(matcher)
结果
keywords values
0 cheapest cheap shoes budget
1 luxury shoes expensive
2 cheap hiking shoes budget | sport
3 liverpool
只是想先说明一下,这个问题是从我之前的一个问题演变而来的,可以找到
假设我们有以下数据框:
d = {'keywords' :['cheapest cheap shoes', 'luxury shoes', 'cheap hiking shoes','liverpool']}
keywords = pd.DataFrame(d,columns=['keywords'])
In [7]: keywords
Out[7]:
keywords
0 cheapest cheap shoes
1 luxury shoes
2 cheap hiking shoes
3 liverpool
然后创建一个字典,其中包含我想与 DataFrame 中的值匹配的关键字
labels = {'cheape' : 'budget', 'cheap' : 'budget', 'luxury' : 'expensive',
'hiking' : 'sport', 'pool': 'pool'}
提供给我的原始答案帮助解决了字典中匹配键的问题
d = {'keywords' :['cheapest cheap shoes', 'luxury shoes', 'cheap hiking
shoes','liverpool']}
keywords = pd.DataFrame(d,columns=['keywords'])
labels = {'cheape' : 'budget', 'cheap' : 'budget', 'luxury' :
'expensive','hiking' : 'sport', 'pool': 'pool'}
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 cheapest cheap shoes budget | budget
1 luxury shoes expensive
2 cheap hiking shoes budget | sport
3 liverpool pool
但是,我 运行 遇到了部分匹配产生的匹配问题。在上面的输出中,请注意 cheape 将如何匹配 "cheapest" 以及 pool 将如何匹配 "liverpool"
所以我的问题是:有没有办法让我的字典与关键字中的值完全匹配,从而跳过部分匹配?
我想要的结果是:
keywords values
0 cheapest cheap shoes budget
1 luxury shoes expensive
2 cheap hiking shoes budget | sport
3 liverpool N/A
旁注 - 字典将扩展以包含与相同值相关联的键。这是为了捕获任何拼写变体或拼写错误,例如{'car' : 'Automobile', 'cars' : 'Automobile', 'carss' : 'Automobile'}
这就是为什么我想要完全匹配以防止出现任何重复/不相关的值。
干杯
试试这个:
df['values'] = (df['keywords']
.str.split(expand=True)
.apply(lambda x: x.map(labels).add(' | ').fillna(''))
.sum(axis=1)
.str.rstrip(' | ')
.replace('', 'N/A'))
结果:
In [60]: df
Out[60]:
keywords values
0 cheapest cheap shoes budget
1 luxury shoes expensive
2 cheap hiking shoes budget | sport
3 liverpool N/A
这是一个符合我第一个的解决方案。 str.split(' ')
用空格分割字符串。
import pandas as pd
d = {'keywords' :['cheapest cheap shoes', 'luxury shoes',
'cheap hiking shoes', 'liverpool']}
keywords = pd.DataFrame(d, columns=['keywords'])
labels = {'cheape': 'budget', 'cheap': 'budget', 'luxury': 'expensive',
'hiking': 'sport', 'pool':'pool'}
df = pd.DataFrame(d)
def matcher(k):
x = (i for i in labels if i in k.split(' '))
return ' | '.join(map(labels.get, x))
df['values'] = df['keywords'].map(matcher)
结果
keywords values
0 cheapest cheap shoes budget
1 luxury shoes expensive
2 cheap hiking shoes budget | sport
3 liverpool