Страницы

Поиск по вопросам

суббота, 21 марта 2020 г.

Ошибка Python Pandas - The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

#python #pandas


Жестко затупил на контрольном задании на курсе ЯндексПрактикум "Аналитик данных"

Дана таблица:

df = pd.read_csv('/datasets/music_project.csv')


Задание:

Утро понедельника и вечер пятницы — разная музыка или одна и та же?

Ищем ответ на вопрос, какие жанры преобладают в разных городах в понедельник утром
и в пятницу вечером. Есть предположение, что в понедельник утром пользователи слушают
больше бодрящей музыки (например, жанра поп), а вечером пятницы — больше танцевальных
(например, электронику).

Получим таблицы данных по Москве moscow_general и по Санкт-Петербургу spb_general.

# получение таблицы moscow_general из тех строк таблицы df, 
# для которых значение в столбце 'city' равно 'Moscow'
moscow_general = df[df['city'] == 'Moscow']


# получение таблицы spb_general
# для которых значение в столбце 'city' равно 'Saint-Petersbur'
spb_general = df[df['city'] == 'Saint-Petersburg']


Создаём функцию genre_weekday(), которая возвращает список жанров по запрошенному
дню недели и времени суток с такого-то часа по такой-то.

def genre_weekday(df, day, time1, time2):
    genre_list =  df[ (df['weekday'] == day) & (df['time']>time1) & (time2>df['time'])]
    genre_list_sorted = genre_list.groupby('genre_name')['genre_name'].count().sort_values(ascending
= False).head(10) 
    return genre_list_sorted

# объявление функции genre_weekday() с параметрами df, day, time1, time2

# в переменной genre_list сохраняются те строки df, для которых одновременно:
# 1) значение в столбце 'weekday' равно параметру day,
# 2) значение в столбце 'time' больше time1 и
# 3) меньше time2.

# в переменной genre_list_sorted сохраняются в порядке убывания  
# первые 10 значений Series, полученной подсчётом числа значений 'genre_name'
# сгруппированной по столбцу 'genre_name' таблицы genre_list

# функция возвращает значение genre_list_sorted


Cравниваем полученные результаты по таблице для Москвы и Санкт-Петербурга в понедельник
утром (с 7 до 11) и в пятницу вечером (с 17 до 23).

Утро понедельника в Москве

# <вызов функции для утра понедельника в Москве (вместо df таблица moscow_general)>
genre_weekday(moscow_general, 'Monday', '07:00:00', '11:00:00')


Результат:

genre_name
pop            781
dance          549
electronic     480
rock           474
hiphop         286
ruspop         186
world          181
rusrap         175
alternative    164
classical      157
Name: genre_name, dtype: int64


Утро понедельника в СПб

# <вызов функции для утра понедельника в Петербурге (вместо df таблица spb_general)>
genre_weekday(spb_general, 'Monday', '07:00:00', '11:00:00')


Результат:

genre_name
pop            218
dance          182
rock           162
electronic     147
hiphop          80
ruspop          64
alternative     58
rusrap          55
jazz            44
classical       40
Name: genre_name, dtype: int64


Вечер пятницы в Москве

# <вызов функции для вечера пятницы в Москве>
genre_weekday(moscow_general, 'Friday', '17:00:00', '23:00:00')


Результат:

genre_name
pop            713
rock           517
dance          495
electronic     482
hiphop         273
world          208
ruspop         170
alternative    163
classical      163
rusrap         142
Name: genre_name, dtype: int64


Вечер пятницы в СПб

# <вызов функции для вечера пятницы в Питере>
genre_weekday(spb_general, 'Friday', '17:00:00', '23:00:00')


Результат:

genre_name
pop            256
rock           216
electronic     216
dance          210
hiphop          97
alternative     63
jazz            61
classical       60
rusrap          59
world           54
Name: genre_name, dtype: int64


Популярные жанры в понедельник утром в Питере и Москве оказались похожи: везде, как
и предполагалось, популярен поп. Несмотря на это, концовка топ-10 для двух городов
различается: в Питере в топ-10 входит джаз и русский рэп, а в Москве жанр world.

В конце недели ситуация не меняется. Поп-музыка всё так же на первом месте. Опять
разница заметна только в концовке топ-10, где в Питере пятничным вечером тоже присутствует
жанр world

Конец задания

Вроде все сходится с написанными Яндексом подсказками и выводами, но при сдаче задания
на проверку дает ошибку The truth value of a Series is ambiguous. Use a.empty, a.bool(),
a.item(), a.any() or a.all().

Суть ошибки вроде бы понял, но не понимаю в какой момент она возникает.

Если это может помочь, ссылка на диск со всеми заданиями. cell In [48]:
https://yadi.sk/d/xO0cm83NXVyPJA
    


Ответы

Ответ 1



Возможно, проблема в этой строке: genre_list = df[ (df['weekday'] == day) & (df['time']>time1) & (time2>df['time'])] Попробуйте заменить на какой-нибудь из этих вариантов: genre_list = df.query('weekday == @day and @time2 > time > @time1') genre_list = df.loc[(df['weekday'] == day) & (df['time'].between(time1, time2, inclusive=False))]

Ответ 2



У меня валидатор принял такой вариант: genre_list = df[ (df['weekday'] == day) & (df['time'] > time1) & (df['time'] < time2)] возможно ему важно в каком порядке идут сравниваемые величины..

Комментариев нет:

Отправить комментарий