Спасибо Юн Вану, который предложил функцию get_dummies
в пандах.Мы можем значительно сократить код:
df = pd.DataFrame({
'movie_id': range(5),
'gernes': [
'Action|Adventure|Fantasy|Sci-Fi',
'Action|Adventure|Fantasy',
'Action|Adventure|Thriller',
'Action|Thriller',
'Action|Adventure|Sci-Fi'
]
})
dummies = df['gernes'].str.get_dummies(sep='|')
final = pd.concat([df, dummies], axis=1)
Результат:
movie_id gernes Action Adventure Fantasy Sci-Fi Thriller
0 0 Action|Adventure|Fantasy|Sci-Fi 1 1 1 1 0
1 1 Action|Adventure|Fantasy 1 1 1 0 0
2 2 Action|Adventure|Thriller 1 1 0 0 1
3 3 Action|Thriller 1 0 0 0 1
4 4 Action|Adventure|Sci-Fi 1 1 0 1 0
Оригинальный ответ
Одно решение, объединяющее панд и методы подготовки данных из машинного обучения.Предполагая, что вы работаете в pandas v0.25 или более поздней версии.
Сначала давайте создадим кадр данных из вашего скриншота:
df = pd.DataFrame({
'movie_id': range(5),
'gernes': [
'Action|Adventure|Fantasy|Sci-Fi',
'Action|Adventure|Fantasy',
'Action|Adventure|Thriller',
'Action|Thriller',
'Action|Adventure|Sci-Fi'
]
})
movie_id gernes
0 0 Action|Adventure|Fantasy|Sci-Fi
1 1 Action|Adventure|Fantasy
2 2 Action|Adventure|Thriller
3 3 Action|Thriller
4 4 Action|Adventure|Sci-Fi
Фильм может принадлежать нескольким гернам.Мы хотим отделить эти gernes с помощью процесса, называемого однократное кодирование .Мы определяем категории («Действие», «Приключение», «Триллер» и т. Д.) И помечаем каждый фильм как принадлежащий к каждой категории или нет:
from sklearn.preprocessing import OneHotEncoder
s = df['gernes'].str.split('|').explode()
encoder = OneHotEncoder()
encoded = encoder.fit_transform(s.values[:, None])
one_hot_df = pd.DataFrame(encoded.toarray(), columns=np.ravel(encoder.categories_), dtype='int') \
.groupby(s.index) \
.sum()
Action Adventure Fantasy Sci-Fi Thriller
0 1 1 1 1 0
1 1 1 1 0 0
2 1 1 0 0 1
3 1 0 0 0 1
4 1 1 0 1 0
Что означает, что первый фильм относится к «Действие», «Приключение»,Фэнтези и Sci-Fi, но не триллер категории, второй фильм относится к боевикам, приключениям и фэнтези и так далее.Конечная остановка - объединить их вместе:
final = pd.concat([df, one_hot_df], axis=1)
movie_id gernes Action Adventure Fantasy Sci-Fi Thriller
0 0 Action|Adventure|Fantasy|Sci-Fi 1 1 1 1 0
1 1 Action|Adventure|Fantasy 1 1 1 0 0
2 2 Action|Adventure|Thriller 1 1 0 0 1
3 3 Action|Thriller 1 0 0 0 1
4 4 Action|Adventure|Sci-Fi 1 1 0 1 0