python pandas使用带正则表达式的map

时间:2015-05-12 06:27:00

标签: python regex pandas

我有一个词典:

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”

4 个答案:

答案 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

使用字符串方法清理数据后,将其映射就很容易了。