我有这样一个数据帧:
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
中,列表中有ebc
和beer
。对于第一条记录,我只希望删除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
免责声明:我是trrex的作者
如果您关心性能,请使用trrex:
输出
函数make将构建一个trie regex。为了更好地理解正在发生的事情,make生成以下正则表达式:
参数n=1意味着模式将只被替换一次,从documentation:
相关问题 更多 >
编程相关推荐