В 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
  • Отбираем из него элементы с нужной частотой
  • Берём индекс этих элементов - именно в индексе будет список нужных тегов (а в значениях там число повторений тегов)
  • Фильтруем колонку с тегами по вхождению элементов столбца в список выше найденных редких тегов
  • Ну и присваиваем нафильтрованным строкам в колонку с тегами наш новый тег
→ Ссылка