有什么办法可以使用apply和lambda来编写函数“ def”

时间:2019-10-30 13:10:47

标签: python pandas

我对此很陌生。我只想编写漂亮的代码。现在,我正在从一列(URL列)中提取字符串,并定义新列以添加提取的值。我正在根据字典提取字符串。这是我的代码:

Df样本:

enter image description here

def conv_attribution_brand_keyword(domain, url):

    if domain in dict_brand_keywords.keys():

        for keyword in dict_brand_keywords[domain]:
            if keyword in url:
                  return(keyword) 

字典:

brand_dict = {'bmw': ['/1er/', '/m/', '/2er/', '/3er/', '/4er/', '/5er/', '/6er/', '/7er/', '/8er/', '/x/', '/z4/', '/bmw-i/'], 'audi': ['/a1/', '/a3/', '/a4/', '/a5/', '/a6/', '/a7/', '/a8/', '/q2/', '/q3/', '/q5/', '/q7/', '/q8/', '/tt/', '/r8/', '/tron/'], 'mercedes-benz': ['/c-class/', '/e-class/', '/s-class/', '/gle/', '/cla/', '/cls/', '/glc/', '/amg-gt/', '/a-class/', '/sl/', '/slc/', '/b-class/', '/eqc/', '/g-class/', '/gla/', '/glb/', '/gls/', '/v-class/', '/x-class/'], 'skoda-auto': ['/fabia/', '/scala/', '/kamiq/', '/octavia-neu/', '/karoq/', '/kodiaq/', '/superb/']}

有什么方法可以减少这些行数。

我只想还原行并希望获得输出,该输出基于字典值提取关键字。

2 个答案:

答案 0 :(得分:3)

您可以将其缩短一点:

def conv_attribution_brand_keyword(domain, url):
    for keyword in dict_brand_keywords.get(domain, []):
        if keyword in url:
            return keyword

我认为这还可以:)

答案 1 :(得分:1)

您可以(至少在Python 3.8中),但是您可能不想这么做。

conv_attribution_brand_keyword = (lambda domain, url: rv
                                    if any((rv:=keyword) in url
                                           for keyword in dict_brand_keywords.get(domain, []))
                                    else None)

(多行仅用于显示目的;所有换行符都可以删除。)

(有些hack在Python 3.8之前会做同样的事情,但没有赋值表达式运算符:=,但看起来更糟。)