Выберите строки, основанные на операторе where

#python #pandas #where

#python #панды #где

Вопрос:

Как я могу выбрать значения, в которых есть слово «link», и поместить их в category1 и «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
 

Ответ №1:

Вы могли бы использовать np.select для установки category значения 1 or 2 в зависимости от того, содержится ли 'link' or '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
 

Ответ №2:

Вы можете использовать функцию apply:

Создайте def:

 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
 

Дает вам тот же результат.

Комментарии:

1. это самый простой способ сделать это, но обратите внимание, что было бы более эффективно запускать get_categories метод непосредственно в столбце модели. Выполнение этого встроенного будет выглядеть так: df['category'] = df.model.apply(lambda x: 1 if 'link' in x else 2 if 'popcorn' in x else 3)