#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Учитывая фрейм данных, подобный:
df = pd.DataFrame(
{
'Movie':
[
'Star Trek',
'Harry Potter',
'Bohemian Rhapsody',
'The Imitation Game',
'The Avengers'
],
'Genre':
[
'sci-fi; fiction',
'fantasy; fiction; magic',
'biography; drama; music',
'biography; drama; thriller',
'action; adventure; sci-fi'
]
}
)
Я хотел бы сгруппировать по отдельным тегам в столбце «Жанр» и собрать фильмы в виде списков, таких как:
0
magic [Harry Potter]
sci-fi [Star Trek, The Avengers]
fiction [Star Trek, Harry Potter]
drama [Bohemian Rhapsody, The Imitation Game]
fantasy [Harry Potter]
music [Bohemian Rhapsody]
thriller [The Imitation Game]
action [The Avengers]
biography [Bohemian Rhapsody, The Imitation Game]
adventure [The Avengers]
Мой текущий код работает, но я хотел бы знать, есть ли более эффективные способы сделать это.
Например.
- нет необходимости конвертировать между списком, фреймом данных и словарем,
- нет необходимости использовать цикл for (возможно, что-то вроде
groupby
)
genre = df['Genre'].apply(lambda x: str(x).split("; ")).tolist()
movie = df['Movie'].tolist()
data = dict()
for m,genres in zip(movie, genre):
for g in genres:
try:
g_ = data[g]
except:
data[g] = [m]
else:
g_.append(m)
for key,value in data.items():
data[key] = [data[key]]
output = pd.DataFrame.from_dict(data, orient='index')
Ответ №1:
Это проще, когда мы сначала разделяем жанры на список
df['Genre'] = df.Genre.str.split('; ')
df.explode('Genre').groupby('Genre')['Movie'].apply(list)
Вывод
action [The Avengers]
adventure [The Avengers]
biography [Bohemian Rhapsody, The Imitation Game]
drama [Bohemian Rhapsody, The Imitation Game]
fantasy [Harry Potter]
fiction [Star Trek, Harry Potter]
magic [Harry Potter]
music [Bohemian Rhapsody]
sci-fi [Star Trek, The Avengers]
thriller [The Imitation Game]