Получение всех совпадений из списка

Рейтинг: 0Ответов: 2Опубликовано: 07.06.2023

Есть поле датафрейма dataset['genres'], там лежат данные в формате:

[{"id": 28, "name": "Action"}, {"id": 12, "name": "Adventure"}, {"id": 80, "name": "Crime"}]

Мне нужно получить только список жанров, в формате [Action, Adventure, Crime]

Я использую следующий код:

dataset['genres'].str.extractall('name": "([A-Za-z]*)"}')

Но он возвращает только первое совпадение. В документации не смог найти про это информацию. Какие параметры использовать, чтобы возвращались все совпадения списком?

Ответы

▲ 2Принят

Если данные - текст, а не список, то можно либо использовать ast.literal_eval и далее работать со списком словарей либо воспользоваться extractall c дополнительными преобразованиями - группировкой и агрегацией:

import pandas as pd

df = pd.Series(['[{"id": 28, "name": "Action"}, {"id": 12, "name": "Adventure"}, {"id": 80, "name": "Crime"}]',
                '[{"id": 12, "name": "Comedy"}, {"id": 80, "name": "Drama"}]',
                '[{"id": 80, "name": "Cartoon"}]'],name='genres').to_frame()
df['genres'] = df['genres'].str.extractall(r'name":\s*"([^"]*)"}').groupby(level=0).agg(list)
print(df)
                       genres
0  [Action, Adventure, Crime]
1             [Comedy, Drama]
2                   [Cartoon]
▲ 1

Я предполагаю, что поле в Вашей таблице выглядит так. Я сгенерировал искусственную серию, исходя из Вашего примера, повторив Ваш пример 10 раз:

import pandas as pd

example = [[{"id": 28, "name": "Action"}, 
            {"id": 12, "name": "Adventure"}, 
            {"id": 80, "name": "Crime"}]] * 10
df = pd.DataFrame(pd.Series(example), columns=['genres'])

Тогда Ваша задача решается применением .apply с генератором списка из списка словарей:

genre_series = df.genres.apply(lambda x: [genre['name'] for genre in x])

На выходе получаем серию списков с жанрами.