Панды использования запроса - PullRequest
0 голосов
/ 18 ноября 2018

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

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 был объявлен как переменная для использования.

1 Ответ

0 голосов
/ 18 ноября 2018

Вы можете сравнивать строковые столбцы с меньшим количеством операторов , но, очевидно, это не имеет смысла.

print(df)
    nameA   nameB
0  Donald  Donald
1   Daffy   Daffy
2  Minnie  Minnie

Альтернативное решение с тем же выходом - использовать boolean indexing с логической маской - здесь можно увидеть, что сравнение возвращает только False значений, поэтому вывод пуст DataFrame:

mask = df['nameA'] < df['nameB']
print (mask)
0    False
1    False
2    False
dtype: bool

df2 = df[mask]
print (df2)
Empty DataFrame
Columns: [nameA, nameB]
Index: []

df2 = df.query('nameA < nameB')
print(df2)
Empty DataFrame
Columns: [nameA, nameB]
Index: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...