Предположим, что перед нами стоит задача быстро оценить, сколько футболистов относится к каждой из представленных национальностей.
Так как каждая строка датафрейма содержит информацию об отдельно взятом футболисте, то достаточно посчитать, сколько раз каждая из национальностей встречается в столбце (в серии) Nationality:
s = small_football['Nationality'].value_counts()s
Nationality
Spain 4
Argentina 3
Belgium 3
Uruguay 3
Germany 3
France 2
Portugal 1
Brazil 1
Croatia 1
Slovenia 1
Poland 1
England 1
Italy 1
Name: count, dtype: int64
Таким образом, функция value_counts подсчитывает для каждого значения в серии количество раз, которое это значение встречается.
Индекс серии s — это уникальные значения, встречающиеся в исходной серии small_df['Nationality']:
Обратите внимание, что в индексе названия сборных идут так же, как в серии, то есть по убыванию числа футболистов. Значит, вызвав первый элемент индекса, мы получим название сборной, у которой больше всего футболистов в рамках датафрейма:
s.index[0]
'Spain'
Если вызовем функцию len для серии s, то получим количество уникальных значений исходной серии, то есть количество национальностей, которые встречаются в датафрейме small_football:
len(s.index)
13
Если хотим определить количество футболистов в small_football, которые относятся к определенной национальности, то достаточно обратиться по нужному индексу к элементу серии:
s['Germany']
3
Получившуюся серию s можно отфильтровать по определенному значению. Например, оставить только такие сборные, в которых больше 1 футболиста:
s.loc[s >1]
Nationality
Spain 4
Argentina 3
Belgium 3
Uruguay 3
Germany 3
France 2
Name: count, dtype: int64
Сколько футбольных клубов представлено в датасете?
Как называется футбольный клуб, представленный наименьшим количеством игроков в датасете?
Можно посчитать количество футболистов не в абсолютных числах, а в процентах от общего числа в датасете. Для этого надо вызвать функцию value_counts() с параметром normalize=True:
s = small_football['Nationality'].value_counts(normalize=True)s
Nationality
Spain 0.16
Argentina 0.12
Belgium 0.12
Uruguay 0.12
Germany 0.12
France 0.08
Portugal 0.04
Brazil 0.04
Croatia 0.04
Slovenia 0.04
Poland 0.04
England 0.04
Italy 0.04
Name: proportion, dtype: float64
Таким образом, мы можем быстро определить характеристики распределения футболистов между национальностями в нашем наборе данных. Например, мы узнали, что испанцы составляют 16% от общего числа футболистов, которые были взяты нами для выборки small_football.
Данные об игроках каких позиций (Position) занимают более 10% датасета?
Данные об игроках каких позиций (Position) занимают менее 1% датасета?
Ещё один параметр, который можно передать в функцию value_counts, — это параметр bins. Этот параметр удобно передавать, когда мы хотим сгруппировать данные не по категориальному признаку (каким, например, является национальность), а по численному признаку (например, по возрасту).
Сначала сгруппируем данные по численному признаку без параметра bins:
Как видно, мы просто сгруппировали футболистов по возрасту и посчитали количество футболистов внутри каждой возрастной группы. Разброс возрастов не слишком большой, поэтому воспринимается эта информация достаточно легко. Например, мы узнали, что больше всего футболистов в двух группах: 27 лет и 32 года.
Другая ситуация складывается, когда мы попытаемся сгруппировать футболистов по их заработной плате:
Из-за того, что цифры зарплат повторяются не часто , трудно сделать какие-то выводы. Но всё будет более наглядно, если мы разобьем весь возможный диапазон зарплат на 4 равных промежутка и подсчитаем количество футболистов, попадающих в каждый из промежутков. Именно для этого нужен параметр bins:
s.index в данном случае выводит количество уникальных значений, а len(s.index) подсчитывает количество этих значений. На самом деле, сделать это можно было проще, при помощи функции unique:
Функция unique возвращает список уникальных элементов из серии.
Передав получившийся список в функцию len, мы можем подсчитать количество уникальных значений в серии:
len(small_football['Nationality'].unique())
13
Но если наша конечная цель - получить количество уникальных значений в серии, то мы можем поступить ещё проще, вызвав функцию nunique:
small_football['Nationality'].nunique()
13
Иногда бывает полезно преобразовать серию, получившуюся в результате работы функции value_counts, в датафрейм. Для этого нужно к получившейся серии применить функцию reset_index. Эта операция может пригодиться вам в ходе дальнейшего решения задач.
s = small_football['Nationality'].value_counts()s_df = s.reset_index()s_df
Nationality
count
0
Spain
4
1
Argentina
3
2
Belgium
3
3
Uruguay
3
4
Germany
3
5
France
2
6
Portugal
1
7
Brazil
1
8
Croatia
1
9
Slovenia
1
10
Poland
1
11
England
1
12
Italy
1
Ну и чтобы всё выглядело красиво и правильно, переименуем столбцы получившегося датафрейма в соответствии с тем, что в них хранится:
У какого процента испанских специалистов (Nationality = 'Spain') зарплата (Wage) находится в пределах 25% минимума от наблюдаемого уровня зарплат? Ответ в виде целого числа (округлите полученный результат) без знака %.
Подсказка: Для решения задачи используйте value_counts() с параметром bins = 4.
# code
Задача 2
Укажите количество уникальных сборных (Nationality), к которым относятся футболисты, выступающие за клуб (Club) "Manchester United".
# code
Задача 3
С помощью функции unique определите двух футболистов из Бразилии (Nationality = 'Brazil'), выступающих за клуб (Club) 'Juventus'. Перечислите их имена (Name, как в датафрейме) через запятую в алфавитном порядке.
# code
Задача 4
Укажите, какой из клубов (Club) насчитывает большее количество футболистов возрастом (Age) старше 35 лет.
# code
Задача 5
С помощью функции value_counts с параметром bins разбейте всех футболистов сборной (Nationality) Аргентины ('Argentina') на 4 равные группы. Укажите, сколько футболистов в возрасте от 34.75 до 41 года в сборной Аргентины.
# code
Задача 6
Сколько процентов футболистов из Испании (Nationality = 'Spain') имеют возраст (Age) 21 год? Введите с точностью до 2 знаков после запятой без указания знака % (например, 12.35).