#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)