Выберите строки, основанные на операторе where - PullRequest
3 голосов
/ 16 апреля 2019

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

Ответы [ 2 ]

4 голосов
/ 16 апреля 2019

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

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

Создать 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

EDIT:

На основе комментария @gred_data вы можете сделать это в одну строку, чтобы повысить производительность:

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

Получает тот же результат.

...