В Pandas заменить некоторые значения на заданные
Работаю с датафреймом MovieLens (переменная movies_tags_ratings), где преобразовываю столбец данных тегов ('tag'). В нем собрались теги к фильмам в виде списка через пробел.
Создавая из каждого тега фичу (признак), получаем матрицу высокой размерности (тегов более 1500). Есть разные методы, как "укротить" количество фичей (здесь методы PCA, TruncatedSVD; здесь жеограничение количества фичей через параметры применяемых мною трансформеров и проч.).
Однако я хочу опробовать такой подход: выбрать теги, которые встречаются редко, и заменить их на значение 'other'. Как это сделать?
# Объявим функцию для работы с тегами
def change_string_tag(s):
"""
Функция принимает строку и возвращает список слов, разделенных в строке запятой,
которые склеивает (.join()) через пробел
"""
return ' '.join(s.replace(' ', '').replace('-', '').split(', '))
# прогоним через функцию строки столбца жанров
movie_tags = [change_string_tag(g) for g in movies_tags_ratings.tag.values]
movies_tags_ratings['Movie_tags'] = movie_tags # создали колонку Movie_tags
# обучим модель для понимания, каким тегам принадлежит каждый их фильмов
count_vect = CountVectorizer()
X_train_tags = count_vect.fit_transform(movie_tags)
# некоторе теги встречаются заметно чаще остальных
movies_tags_ratings['tag'].value_counts()
# In Netflix queue 276148
# Disney 44669
# ...
# kung fu 22
# black hole 21
# обучим модель, чтобы придать тегам различные веса
tfidf_transformer = TfidfTransformer()
X_train_tfidf_tags = tfidf_transformer.fit_transform(X_train_tags)
# А далее я завис. Чтобы сохранить количество тегов (их, как видим, много),
# низкочастотные теги заменим на значение other
# ниже приведенный код неверный, но как правильно?
movies_tags_ratings.loc[movies_tags_ratings['Movie_tags'].value_counts()<50, 'Movie_tags'] = 'other'
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
Наверное можно проще, а у меня получилось так:
vc = movies_tags_ratings['Movie_tags'].value_counts()
movies_tags_ratings.loc[movies_tags_ratings['Movie_tags'].isin(vc[vc < 50].index), 'Movie_tags'] = 'other'
- Делаем отдельный датафрейм с
value_counts - Отбираем из него элементы с нужной частотой
- Берём индекс этих элементов - именно в индексе будет список нужных тегов (а в значениях там число повторений тегов)
- Фильтруем колонку с тегами по вхождению элементов столбца в список выше найденных редких тегов
- Ну и присваиваем нафильтрованным строкам в колонку с тегами наш новый тег