如何从df中找到搜索列表中所有元素都存在的行



我有一个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]

最新更新