Разделение категорий в одном столбце в моем фрейме данных - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно изучить кое-что о наиболее экономически эффективных жанрах кино.Моя проблема в том, что все жанры представлены в одной строке:

list of movie genres

Это дает мне около 300 различных уникальных категорий.Как я могу разделить их на 12 оригинальных фиктивных столбцов жанра, чтобы я мог анализировать каждый основной жанр?

1 Ответ

1 голос
/ 21 сентября 2019

Спасибо Юн Вану, который предложил функцию 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
...