比较字符串,若数据帧记录匹配一次,则继续下一行

2024-06-01 00:15:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

df = pd.DataFrame({'item_descrip': ['ebc root beer single', 
                                    'yic yac big pack freshmint', 
                                    'froggy jumbo flakes',
                                    'jumbo tart warmer',
                                    'beer jerky'
                                   ]
})

我有这样一份清单:

brand_list = ['ebc', 'yic yac', 'beer', 'jumbo', 'tart', 'froggy']

我想将brand_list中的字符串与item_descrip列中的字符串相匹配,并删除item_descrip列中的匹配项。我想创建另一列unbranded,其中包含item_descrip中清理过的字符串

我的问题是我有一个非常大的brand_list,这个列表中的一些字符串在item_descrip列中多次匹配。我想要的输出是,如果一行已经找到匹配项,则跳过该行

期望输出:

|    | item_descrip                       | unbranded                          |
|---:|:-----------------------------------|:-----------------------------------|
|  0 | ebc root beer single               | root beer single                   |
|  1 | yic yac big pack freshmint singles | big pack freshmint singles         |
|  2 | froggy jumbo flakes                | jumbo flakes                       |
|  3 | jumbo tart warmer                  | tart warmer                        |
|  4 | beer jerky                         | jerky                              |

这是用于删除匹配项的代码,但它会删除item_descrip列中的所有匹配项。例如,在我的brand_list中,列表中有ebcbeer。对于第一条记录,我只希望删除ebc,而不是beer,因为已经进行了匹配。如果字符串的第一部分匹配,则不要进一步处理该记录并转到下一部分

所以基本上,它看起来像是一个if语句可以进入列表理解,但我不知道如何写出这样的内容:if matched pass,else继续搜索

df['unbranded'] = [' '.join([y for y in x.split() if not y.startswith(tuple(brand_list))]) for x in df['item_descrip']] 

我在这里得到了这一行的大部分: https://stackoverflow.com/questions/51666374/how-to-remove-strings-present-in-a-list-from-a-column-in-pandas


Tags: 字符串indfrootitemlisttartsingle
1条回答
网友
1楼 · 发布于 2024-06-01 00:15:15

免责声明:我是trrex的作者

如果您关心性能,请使用trrex

import pandas as pd
import trrex as tx

df = pd.DataFrame({'item_descrip': ['ebc root beer single',
                                    'yic yac big pack freshmint',
                                    'froggy jumbo flakes',
                                    'jumbo tart warmer',
                                    'beer jerky'
                                    ]
                   })

brand_list = ['ebc', 'yic yac', 'beer', 'jumbo', 'tart', 'froggy']

df['unbranded'] = df['item_descrip'].str.replace(tx.make(brand_list), '', n=1)
print(df)

输出

                 item_descrip            unbranded
0        ebc root beer single     root beer single
1  yic yac big pack freshmint   big pack freshmint
2         froggy jumbo flakes         jumbo flakes
3           jumbo tart warmer          tart warmer
4                  beer jerky                jerky

函数make将构建一个trie regex。为了更好地理解正在发生的事情,make生成以下正则表达式:

\b(?:froggy|tart|beer|yic yac|jumbo|ebc)\b

参数n=1意味着模式将只被替换一次,从documentation

n int, default -1 (all)

Number of replacements to make from start.

相关问题 更多 >