Получение всех совпадений из списка
Есть поле датафрейма 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 шт):
Я предполагаю, что поле в Вашей таблице выглядит так. Я сгенерировал искусственную серию, исходя из Вашего примера, повторив Ваш пример 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])
На выходе получаем серию списков с жанрами.
Если данные - текст, а не список, то можно либо использовать 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]