Select 行基于 where 语句

Select rows that based on a where statement

我如何 select 包含单词 "link" 的值并将它们归入类别 1 并在其中 "popcorn" 使它们成为类别 2 并将所有其他内容归入类别 3?

这是一个示例,但我的实际数据集有数百行

data = {'model': [['Lisa', 'link'], ['Lisa 2', 'popcorn'], ['telephone', 'rabbit']],
        'launched': [1983, 1984, 1991]}

df = pd.DataFrame(data, columns = ['model', 'launched'])

想要

 Model                 launched         category
 ['Lisa', 'link']        1983             1
 ['Lisa 2', 'popcorn']   1984             2
 ['telephone', 'rabbit'] 1991             3

您可以使用 np.selectcategory 设置为 12,具体取决于 'link''popcorn' 是否包含在给定的列表。如果两者都不包含,则将 default 设置为 3

import numpy as np
c1 = ['link' in i for i in df.model]
c2 = ['popcorn' in i for i in df.model]
df['category'] = np.select([c1,c2], [1,2], 3)

              model       launched  category
0         [Lisa, link]      1983         1
1    [Lisa 2, popcorn]      1984         2
2  [telephone, rabbit]      1991         3

您可以使用应用功能:

创建一个定义:

def get_categories(row):
    if 'link' in row.model:
        return 1
    elif 'popcorn' in row.model:
        return 2
    else:
        return 3

然后这样称呼它:

df['category'] = df.apply(get_categories, axis=1)
df

输出:

    model           launched    category
0   [Lisa, link]        1983    1
1   [Lisa 2, popcorn]   1984    2
2   [telephone, rabbit] 1991    3

编辑:

根据@gred_data 评论,您实际上可以在一行中执行此操作以提高性能:

df['category'] = df.model.apply(lambda x: 1 if 'link' in x else 2 if 'popcorn' in x else 3)
df

得到相同的结果。