Решение задачи с помощью pandas python
Прохожу курс, застрял на заключительном тесте первого урока в главе "Анализ данных". Есть football.csv, содержащий информацию о футболистах. Необходимо найти, какое количество вратарей (значение "GK" в столбце "Position") в среднем играет за один клуб (столбец "Club"). Мой вариант решения:
import pandas as pd
data = pd.read_csv ('football.csv')
data = data [data.Position == "GK"].Club.value_counts ().mean ()
print (data)
При условии округления ответа до тысячных, получаем 2.544. Далее обратимся к подсказке и ответу от разработчиков курса: "Для ответа открой набор данных с футболистами создай сводную таблицу, содержащую сведения о количестве игроков, занимающих разные позиции в каждом клубе. Отсутствующие значения замени нулями". Правильный ответ оказался 2.525. Тут возникает множество вопросов. Во-первых, почему мой ответ неверный? Причем разница то небольшая, на уровне погрешности. Во-вторых, формируя сводную таблицу по подсказке из задачи, я столкнулся с такой проблемой: что записывать в values? В index я хотел записать клубы, в columns позиции игроков, агрегирующую функцию взять mean. Затем, проиндексировав сводную таблицу по индексу All, я бы извлек из получившегося результата данные только по голкиперам, и вот он ответ. Таким образом, что передавать в аргумент values? Ведь столбца, который вел бы подсчет по количеству разных позиций игроков в одном клубе нет.
Ответы (1 шт):
попробуйте следовать подсказке:
res = (data
.assign(x=1)
.pivot_table(index="Club", columns="Position",
values="x", aggfunc="sum", fill_value=0)
["GK"]
.mean())
результат:
In [309]: res
Out[309]: 2.5246153846153847
Очевидно в некоторых клубах нет вратарей и отсюда разница в ответах. Проверим догадку:
In [311]: data.assign(x=1).pivot_table(index="Club", columns="Position", values="x", aggfunc="sum", fill_value=0)["GK"].value_counts()
Out[311]:
3 279
2 218
1 77
4 65
5 5
0 5 # <---- NOTE: в пяти клубах нет вратарей!
6 1
Name: GK, dtype: int64