更加聪明的方法来检查一个字符串是否包含列表中的一个元素-python[英] Smarter way to check if a string contains an element in a list - python

本文是小编为大家收集整理的关于更加聪明的方法来检查一个字符串是否包含列表中的一个元素-python的处理方法,想解了更加聪明的方法来检查一个字符串是否包含列表中的一个元素-python的问题怎么解决?更加聪明的方法来检查一个字符串是否包含列表中的一个元素-python问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

List top_brands 包含品牌列表,如

top_brands = ['Coca Cola', 'Apple', 'Victoria\'s Secret', ....]

items 是一个 pandas.DataFrame,其结构如下所示.如果缺少 brand_name,我的任务是从 item_title 填充 brand_name

row     item_title                 brand_name

1    |  Apple 6S                  |  Apple
2    |  New Victoria\'s Secret    |  missing  <-- need to fill with Victoria\'s Secret
3    |  Used Samsung TV           |  missing  <--need fill with Samsung
4    |  Used bike                 |  missing  <--No need to do anything because there is no brand_name in the title 
    ....

我的代码如下.问题在于 对于包含 200 万条记录的数据框来说太慢了.有什么方法可以使用 pandas 或 numpy 来处理任务?

def get_brand_name(row):
    if row['brand_name'] != 'missing':
        return row['brand_name']

    item_title = row['item_title']

    for brand in top_brands:
        brand_start = brand + ' '
        brand_in_between = ' ' + brand + ' '
        brand_end = ' ' + brand
        if ((brand_in_between in item_title) or item_title.endswith(brand_end) or item_title.startswith(brand_start)): 
            print(brand)
            return brand

    return 'missing'    ### end of get_brand_name


items['brand_name'] = items.apply(lambda x: get_brand_name(x), axis=1)

推荐答案

试试这个:

pd.concat([df['item_title'], df['item_title'].str.extract('(?P<brand_name>{})'.format("|".join(top_brands)), expand=True).fillna('missing')], axis=1)

输出:

              item_title         brand_name
0               Apple 6S              Apple
1  New Victoria's Secret  Victoria's Secret
2        Used Samsung TV            Samsung
3              Used Bike            missing

我在我的机器上运行了一个包含 200 万个项目的随机样本:

def read_file():
    df = pd.read_csv('file1.txt')
    new_df = pd.concat([df['item_title'], df['item_title'].str.extract('(?P<brand_name>{})'.format("|".join(top_brands)), expand=True).fillna('missing')], axis=1)
    return new_df

start = time.time()
print(read_file())
end = time.time() - start
print(f'Took {end}s to process')

输出:

                                   item_title         brand_name
0                                    LG watch                 LG
1                                  Sony watch               Sony
2                                 Used Burger            missing
3                                    New Bike            missing
4                               New underwear            missing
5                                    New Sony               Sony
6                        Used Apple underwear              Apple
7                       Refurbished Panasonic          Panasonic
8                   Used Victoria's Secret TV  Victoria's Secret
9                                Disney phone             Disney
10                                Used laptop            missing
...                                       ...                ...
1999990             Refurbished Disney tablet             Disney
1999991                    Refurbished laptop            missing
1999992                       Nintendo Coffee           Nintendo
1999993                      Nintendo desktop           Nintendo
1999994         Refurbished Victoria's Secret  Victoria's Secret
1999995                           Used Burger            missing
1999996                    Nintendo underwear           Nintendo
1999997                     Refurbished Apple              Apple
1999998                      Refurbished Sony               Sony
1999999                      New Google phone             Google

[2000000 rows x 2 columns]
Took 3.2660000324249268s to process

我的机器规格:

<块引用>

Windows 7 专业版 64 位英特尔 i7-4770 @ 3.40GHZ12.0 GB 内存

3.266 秒相当快……对吧?

本文地址:https://www.itbaoku.cn/post/1728019.html