我有一个df,它包含产品id和产品名称列。产品名称列是标记化的,采用列表格式。例如:
Product id Product name
1 [land, cruiser]
1 [land, cruiser]
1 [land, cruiser, toyota]
1 [land, cruiser]
1 [land, toyota]
和search_word = [land, cruiser]
并且我想要选择其中存在来自CCD_ 2的所有元素的所有行。所以,结果应该是
Product id Product name
1 [land, cruiser]
1 [land, cruiser]
1 [land, cruiser]
目前,我写了这个代码:
has_all = data[
data['Product name'].apply(lambda x: np.all([*map(lambda l: l in x, search_words)]))]
如何加快这条线(约42亿行(的速度?在这种情况下,作为列表还是作为使用re
库的字符串工作更快?
您可以使用set
操作和列表理解。
假设输入:
df = pd.DataFrame({'Product id': [1, 1, 1, 1, 1],
'Product name': [['land', 'cruiser'],
['land', 'cruiser'],
['land', 'cruiser', 'toyota'],
['land', 'cruiser'],
['land', 'toyota']]})
# use a set instead of a list!
search_word = set(['land', 'cruiser'])
您可以使用:
df2 = df[[search_word == set(x) for x in df['Product name']]]
输出:
Product id Product name
0 1 [land, cruiser]
1 1 [land, cruiser]
3 1 [land, cruiser]