Нужно разделить данные на три категории
Нужно разделить все фильмы на три категории:
< 90, если фильм длится менее 90 минут;90-120, если фильм длится от 90 минут до 2 часов (включительно);> 120, если фильм длится больше 2 часов
if data['duration']<90:
data['movie_duration_category'] = 1
elif 90<= data['duration'] <= 120:
data['movie_duration_category'] = 2
else:
data['movie_duration_category'] = 3
Почему-то не работает.
Ответы (4 шт):
Автор решения: КИТ KIT
→ Ссылка
Используйте вместо & это and, ведь
& - побитовое И
and - логическое И
Автор решения: КИТ KIT
→ Ссылка
Можно написать так:
categories = {}
films = [{'name': 'random name', 'time': 154}]
for element in films:
if element['time'] < 90:
categories['one'] = element['name']
Автор решения: MaxU
→ Ссылка
воспользуйтесь pandas.cut():
df["movie_duration_category"] = pd.cut(df["duration"], [0, 89, 120, np.inf], labels=[1,2,3])
результат:
In [82]: df
Out[82]:
duration movie_duration_category
0 70 1
1 90 2
2 100 2
3 120 2
4 200 3
Автор решения: CrazyElf
→ Ссылка
На Kaggle я видел, что часто делают так:
import pandas as pd
import numpy as np
df = pd.DataFrame({'duration': np.random.randint(1, 240, 100)})
df['movie_duration_category'] = 3
df.loc[df.duration < 90, 'movie_duration_category'] = 1
df.loc[(df.duration >= 90) & (df.duration <= 120), 'movie_duration_category'] = 2
Обратите внимание на две вещи:
- Сначала идёт присвоение значения всему столбцу, если присвоить только часть значений новому столбцу, тогда в столбце возникнут значения
NAи столбец станет типаfloat, это не очень красиво, придётся его потом переделывать изfloatобратно вint. - Круглые скобки в случае нескольких условий обязательны! Иначе возникает ошибка, которую вы упоминали: The truth value of a Series is ambiguous
Но я больше люблю вариант с использованием Numba, он позволяет записать условия в "человеческом" виде:
import pandas as pd
import numpy as np
from numba import vectorize
@vectorize
def duration2category(duration):
if duration < 90:
return 1
elif 90 <= duration <= 120:
return 2
else:
return 3
df = pd.DataFrame({'duration': np.random.randint(1, 240, 100)})
df['movie_duration_category'] = duration2category(df.duration.values)
Ну, это всё как бы в дополнение к совершенно правильному ответу @MaxU. В Pandas довольно часто одни и те же вещи можно сделать несколькими вполне правильными способами.