Я смотрю на проблему с большим кодом и пытаюсь разбить простые части, чтобы понять их. Я сейчас пытаюсь понять функцию запроса панд. Я воспроизвел небольшой пример для моего обучения.
import pandas as pd
df = pd.DataFrame()
df['nameA'] = ['Donald','Daffy','Minnie']
df['nameB'] = ['Donald','Daffy','Minnie']
df2 = df.query('nameA < nameB')
print(df2)
Я получаю пустой фрейм данных, хотя я видел нечто подобное, сделанное в большей кодовой базе. Может ли кто-нибудь объяснить, какой недостаток у меня в моем фундаментальном понимании?
Я хотел бы проследить за этим, сгруппировав по двум столбцам и получив все комбинации имен, но без дубликатов.
Я пытаюсь проанализировать экзаменационный вопрос, который у меня был пару недель назад. Было два кадра, фильмы и актеры.
Задача была следующая:
Создайте фрейм данных с именем good_teamwork, который содержит четыре столбца:
cast_member_1 and cast_member_2, the names of each pair of cast members that appear in the same movie;
num_movies, the number of movies that each pair of cast members appears in; and
avg_score, the average review score for each of those movies containing the two cast members.
Упорядочить результаты по cast_member_1 в алфавитном порядке из A-Z и разорвать любые связи, отсортировав по cast_member_2 в алфавитном порядке из A-Z. Округлите результат для avg_score до двух (2) десятичных разрядов.
Удалить дубликаты.
Фрейм данных фильма большой, но выглядит примерно так:
id name score
0 9 Star Wars: Episode III - Revenge of the Sith 3D 61
1 24214 The Chronicles of Narnia: The Lion, The Witch ... 46
2 1789 War of the Worlds 94
3 10009 Star Wars: Episode II - Attack of the Clones 3D 28
4 771238285 Warm Bodies 3
Кадр данных приведен в следующем формате:
movie_id cast_id cast_name
0 9 162652153 Hayden Christensen
1 9 162652152 Ewan McGregor
2 9 418638213 Kenny Baker
3 9 548155708 Graeme Blundell
4 9 358317901 Jeremy Bulloch
Код решения следующий:
joined_df = cast.merge(cast, how='inner', left_on='movie_id',
right_on='movie_id')
joined_df = joined_df.query('cast_name_x < cast_name_y')
good_teamwork2 = joined_df.merge(movies, how='inner',
left_on='movie_id', right_on='id')
good_teamwork2 = good_teamwork2.groupby(['cast_name_x',
'cast_name_y']).agg({'movie_id': 'size', 'score':
'mean'}).reset_index()
good_teamwork2.columns = ['cast_member_1', 'cast_member_2',
'avg_score', 'num_movies']
good_teamwork2 = good_teamwork2[good_teamwork2['avg_score'] >= 50]
good_teamwork2 = good_teamwork2[good_teamwork2['num_movies'] >= 3]
good_teamwork2 = good_teamwork2.round({'avg_score': 2})
good_teamwork2 = good_teamwork2.sort_values(by=['cast_member_1',
'cast_member_2'], ascending=[True, True]).reset_index(drop=True)
good_teamwork2 = good_teamwork2[['cast_member_1', 'cast_member_2',
'num_movies', 'avg_score']]
В основном я пытаюсь понять, как оператор запроса и оператор groupby с использованием cast_name_x и cast_name_y получают все комбинации актеров без дубликатов. Я также не вижу, где, например, cast_name_x был объявлен как переменная для использования.