我有一个词典:
dealer = {
'ESSELUNGA': 'Spesa',
'DECATHLON 00000120': 'Sport',
'LEROY MERLIN': 'Casa',
'CONAD 8429': 'Spesa',
'IKEA': 'Casa',
'F.LLI MADAFFARI': 'Spesa',
'SUPERMERCATO IL GIGANT': 'Spesa',
'NATURASI SPA': 'Spesa',
'ESSELUNGA SETTIMO MILANE': 'Spesa'
}
我希望将它映射到pandas df:
entries.Categoria = entries.Commerciante.map(dealer)
有没有办法使用正则表达式匹配“Commerciante”列上的地图?通过这种方式,我可以改写经销商:
dealer = {
'ESSELUNGA': 'Spesa',
'DECATHLON': 'Sport',
'LEROY MERLIN': 'Casa',
'CONAD': 'Spesa',
'IKEA': 'Casa',
'F.LLI MADAFFARI': 'Spesa',
'SUPERMERCATO IL GIGANT': 'Spesa',
'NATURASI SPA': 'Spesa',
'ESSELUNGA SETTIMO MILANE': 'Spesa'
}
并匹配“DECATHLON”和“DECATHLON 00000120”
答案 0 :(得分:1)
谢谢你们所有人。我用你的建议来解决我的问题。我定义了一个新函数:
def dealer_replace(dealer_dict, text):
regex = re.compile("(%s)" % "|".join(map(re.escape, dealer_dict.keys())))
if regex.search(text):
ret = regex.search(text)
return dealer_dict[ret.group()]
else:
return None
并将其与申请
一起使用entries['Categoria'] = entries['Commerciante'].apply(lambda v: dealer_replace(dealer, str(v)))
答案 1 :(得分:0)
可以使用带有正则表达式的dict理解来重写键。
re python模块用于执行此任务,命令为sub
。替换键如下所示:
import re
dealer = {re.sub(r'(\W)[0-9]+',r'\1',k).strip():dealer[k] for k in dealer}
整个例子给出:
import re
dealer = {
'ESSELUNGA': 'Spesa',
'DECATHLON 00000120': 'Sport',
'LEROY MERLIN': 'Casa',
'CONAD 8429': 'Spesa',
'IKEA': 'Casa',
'F.LLI MADAFFARI': 'Spesa',
'SUPERMERCATO IL GIGANT': 'Spesa',
'NATURASI SPA': 'Spesa',
'ESSELUNGA SETTIMO MILANE': 'Spesa'
}
dealer = {re.sub(r'(\W)[0-9]+',r'\1',k).strip():dealer[k] for k in dealer}
答案 2 :(得分:0)
为什么不使用apply
和修改后的字典查找:
In [14]: [dname for dname in dealer if 'DECATHLON' in dname]
Out[14]: ['DECATHLON 00000120']
然后,像这样应用 -
df['Commerciante'] = df['Commerciante'].apply(lambda v: [dname for dname in dealer if dname.startswith('DECATHLON')][0])
答案 3 :(得分:0)
我认为你的问题是你试图一步完成两件事。
首先清理数据,然后映射。
pandas Series拥有许多不错的字符串函数,可以方便地清理数据。 Here is a good reference to the string methods
使用字符串方法清理数据后,将其映射就很容易了。