Извлечь разделенные значения из столбцов

Вопрос или проблема

Я работаю с этим CSV файлом, который представляет собой сборник детализации фильмов из IMDB.
В нем есть жанры столбец в датафрейме со всеми жанрами фильмов, разделенными символом “|”
Мне нужно извлечь первые два жанра из столбца жанры и сохранить их в двух новых столбцах: жанр_1 и жанр_2.
А для столбцов, где есть только 1 жанр, необходимо извлечь единственный жанр в оба столбца, то есть для таких фильмов жанр_2 будет таким же, как жанр_1.

Я делюсь скриншотами кода и результатов, которые я получил. Это мой датафрейм, фильмы и столбец жанра
Это то, что я пробовал

Теперь я могу создать новый датафрейм с созданными жанрами и затем удалить ненужные столбцы и объединить оставшиеся с оригинальным датафреймом. Но это выглядит довольно громоздко.
Как я могу разделить столбец в своем оригинальном датафрейме и удалить ненужные расширенные столбцы?
Буду признателен за любую помощь.

Это вопрос программирования, а не вопрос науки о данных.

Вам нужно использовать apply с функцией lambda. Так что если ваш DataFrame называется movies:

В apply вы должны добавить axis=1, что означает, что вы применяете функцию к строкам, а не к столбцам.

def get_genre(row, genre_index):
    array_genres = row['genres'].split('|')

    if len(array_genres) == 0:
        return ''
    elif len(array_genres) == 1 and genre_index == 1:
        return  array_genres[0]
    else:
        return array_genres[genre_index]

movies['genre_1'] = movies.apply(lambda row: get_genre(row, 0), axis=1)
movies['genre_2'] = movies.apply(lambda row: get_genre(row, 1), axis=1)

Попробуйте:

# Создадим пример датафрейма
df = pd.DataFrame({"genres":["Фантастика|Научная фантастика",
                "Экшн|Приключения|Фантастика",
                "Триллер",
                "Экшн|Приключения|Триллер|bbv","Экшн","Экшн|Приключения|триллер"]})

# Получите датафрейм с таким количеством столбцов, сколько жанров
df = df.genres.str.get_dummies(sep = "|")

# Получите жанры как значения
df = df.multiply(df.columns)

# Переименуйте столбцы, чтобы получить id жанра
df.columns = ["жанр_" + str(x) for x in range(len(df.columns))]

Входные данные:

вставьте описание изображения здесь

Выходные данные:

вставьте описание изображения здесь

ИСПРАВЛЕНИЕ:

вы можете просто использовать метод assign библиотеки pandas:

df.assign(genre1= df.genres.str.split("|", expand = True).iloc[:,:1],
          genre2 = df.genres.str.split("|", expand = True).iloc[:,1:2])

*Выходные данные:

вставьте описание изображения здесь

Ответ или решение

Извлечение жанров из столбца DataFrame в Python с использованием Pandas

Работа с CSV-файлами, содержащими коллекцию данных, популярных в киноиндустрии, таких как IMDb, часто предполагает необходимость обработки данных в рамках определённых требований. В частности, если у вас есть столбец genres, в котором жанры фильмов разделены символом вертикальной черты (|), это может потребовать извлечения первых двух жанров и сохранения их в отдельных столбцах (genre_1 и genre_2). В данной статье мы рассмотрим, как это сделать, используя библиотеку Pandas в Python.

Обзор задачи

Мы имеем DataFrame с колонкой жанров, которая может содержать от одного до нескольких жанров, разделённых символом |. Нам необходимо:

  1. Создать два новых столбца: genre_1 и genre_2.
  2. Для фильмов с одним жанром заполнить оба столбца одним и тем же значением.
  3. В случае наличия нескольких жанров извлечь только первые два.

Решение с использованием Pandas

Для выполнения данной задачи мы можем использовать метод apply вместе с лямбда-функцией для построчной обработки элементов DataFrame. Вот пример реализации:

import pandas as pd

# Пример DataFrame
df = pd.DataFrame({"genres": [
    "Fantasy|Sci-Fi",
    "Action|Adventure|Fantasy",
    "Thriller",
    "Action|Adventure|Thriller|bbv",
    "Action",
    "Action|Adventure|Thriller"
]})

# Определим функцию для извлечения жанров
def extract_genres(genres):
    genre_list = genres.split('|')

    # Если жанров нет, возвращаем пустую строку
    if len(genre_list) == 0:
        return '', ''
    elif len(genre_list) == 1:
        # Если только один жанр, дублируем его
        return genre_list[0], genre_list[0]
    else:
        # Если больше одного жанра, возвращаем первые два
        return genre_list[0], genre_list[1]

# Применим функцию к DataFrame
df['genre_1'], df['genre_2'] = zip(*df['genres'].apply(extract_genres))

# Выводим результирующий DataFrame
print(df)

Результат

После выполнения кода выше, ваш DataFrame будет выглядеть следующим образом:

                       genres       genre_1       genre_2
0              Fantasy|Sci-Fi       Fantasy        Sci-Fi
1   Action|Adventure|Fantasy         Action     Adventure
2                      Thriller      Thriller      Thriller
3  Action|Adventure|Thriller|bbv      Action    Adventure
4                       Action      Action        Action
5      Action|Adventure|Thriller     Action    Adventure

Использование методов Pandas для удобства

Чтобы избежать создания лишних столбцов и сделать код более читабельным, вы также можете воспользоваться методом assign вместе с str.split. Вот другой подход решения нашей задачи:

# Использование assign для создания новых столбцов
df = df.assign(
    genre_1=df['genres'].str.split('|').str[0],
    genre_2=df['genres'].str.split('|').str[1].fillna('')
)

# Дублирование genre_1 в genre_2 для случаев с единственным жанром
df['genre_2'] = df.apply(lambda x: x['genre_1'] if x['genre_2'] == '' else x['genre_2'], axis=1)

# Выводим результирующий DataFrame
print(df)

Этот метод более лаконичен и позволяет избежать излишне сложных манипуляций с данными.

Заключение

В завершающей части нашей статьи мы рассмотрели два способа извлечения жанров из столбца DataFrame в Python с использованием библиотеки Pandas. Первый способ демонстрирует мощность метода apply, в то время как второй способ использует встроенные функции Pandas для достижения более чистого и понятного кода. Эти техники могут быть полезны не только при работе с данными о фильмах, но и в других сценариях обработки данных, где необходима предобработка строковых значений.

Оцените материал
Добавить комментарий

Капча загружается...