Футболисты

В датасете присутствуют различные данные о футболистах, среди которых:

Полное описание всех полей находится в файле по ссылке.

Данные содержат в себе информацию о 12897 футболистах и их характеристиках.

pd.read_csv('Полный_путь_к_файлу/название_файла.csv')

Функция возвращает DataFrame (таблицу), однако затем принимает ещё много важных параметров, среди которых:

Дополнительные параметры можно посмотреть в официальной документации.

Часто после чтения данных с помощью read_csv() хочется убедиться в правильности чтения или, к примеру, посмотреть, что лежит в наборе данных.

Для этого используются методы .head() или .tail(), которые показывают первые или последние 5 строк таблицы. Количество строк можно менять параметром n, передаваемым в функцию.

Посмотрим, как они работают, на примере уже запомнившегося нам набора данных о футболистах:

import pandas as pd

url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/data/football.csv"

football = pd.read_csv(url)
football.head()
Unnamed: 0 Name Age Nationality Club Value Wage Position Crossing Finishing ... Penalties Composure Marking StandingTackle SlidingTackle GKDiving GKHandling GKKicking GKPositioning GKReflexes
0 0 L. Messi 31 Argentina FC Barcelona 110500000 565000 RF 84 95 ... 75 96 33 28 26 6 11 15 14 8
1 1 Cristiano Ronaldo 33 Portugal Juventus 77000000 405000 ST 84 94 ... 85 95 28 31 23 7 11 15 14 11
2 2 Neymar Jr 26 Brazil Paris Saint-Germain 118500000 290000 LW 79 87 ... 81 94 27 24 33 9 9 15 15 11
3 3 De Gea 27 Spain Manchester United 72000000 260000 GK 17 13 ... 40 68 15 21 13 90 85 87 88 94
4 4 K. De Bruyne 27 Belgium Manchester City 102000000 355000 RCM 93 82 ... 79 88 68 58 51 15 13 5 10 13

5 rows × 42 columns

import pandas as pd

football = pd.read_csv(url)
football.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12897 entries, 0 to 12896
Data columns (total 42 columns):
 #   Column           Non-Null Count  Dtype 
---  ------           --------------  ----- 
 0   Unnamed: 0       12897 non-null  int64 
 1   Name             12897 non-null  object
 2   Age              12897 non-null  int64 
 3   Nationality      12897 non-null  object
 4   Club             12897 non-null  object
 5   Value            12897 non-null  int64 
 6   Wage             12897 non-null  int64 
 7   Position         12897 non-null  object
 8   Crossing         12897 non-null  int64 
 9   Finishing        12897 non-null  int64 
 10  HeadingAccuracy  12897 non-null  int64 
 11  ShortPassing     12897 non-null  int64 
 12  Volleys          12897 non-null  int64 
 13  Dribbling        12897 non-null  int64 
 14  Curve            12897 non-null  int64 
 15  FKAccuracy       12897 non-null  int64 
 16  LongPassing      12897 non-null  int64 
 17  BallControl      12897 non-null  int64 
 18  Acceleration     12897 non-null  int64 
 19  SprintSpeed      12897 non-null  int64 
 20  Agility          12897 non-null  int64 
 21  Reactions        12897 non-null  int64 
 22  Balance          12897 non-null  int64 
 23  ShotPower        12897 non-null  int64 
 24  Jumping          12897 non-null  int64 
 25  Stamina          12897 non-null  int64 
 26  Strength         12897 non-null  int64 
 27  LongShots        12897 non-null  int64 
 28  Aggression       12897 non-null  int64 
 29  Interceptions    12897 non-null  int64 
 30  Positioning      12897 non-null  int64 
 31  Vision           12897 non-null  int64 
 32  Penalties        12897 non-null  int64 
 33  Composure        12897 non-null  int64 
 34  Marking          12897 non-null  int64 
 35  StandingTackle   12897 non-null  int64 
 36  SlidingTackle    12897 non-null  int64 
 37  GKDiving         12897 non-null  int64 
 38  GKHandling       12897 non-null  int64 
 39  GKKicking        12897 non-null  int64 
 40  GKPositioning    12897 non-null  int64 
 41  GKReflexes       12897 non-null  int64 
dtypes: int64(38), object(4)
memory usage: 4.1+ MB

Метод describe показывает основные статистические характеристики данных по каждому числовому признаку (типы int64 и float64): число непропущенных значений, среднее, стандартное отклонение, диапазон, медиану, 0.25 и 0.75 квартили.

import pandas as pd

football = pd.read_csv(url)
football.describe()
Unnamed: 0 Age Value Wage Crossing Finishing HeadingAccuracy ShortPassing Volleys Dribbling ... Penalties Composure Marking StandingTackle SlidingTackle GKDiving GKHandling GKKicking GKPositioning GKReflexes
count 12897.000000 12897.000000 1.289700e+04 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000 ... 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000 12897.000000
mean 6605.040862 24.795379 2.112449e+06 7517.562224 47.076374 42.876328 50.202528 56.026983 40.295030 52.461735 ... 46.459874 55.942932 45.655811 46.186710 44.386679 17.218345 16.962317 16.797938 16.950221 17.315965
std 3782.545526 4.872212 6.498424e+06 23061.985387 18.043470 19.096935 17.281593 14.740436 17.080687 18.871643 ... 15.479313 11.280631 19.456346 21.172586 20.726546 18.085618 17.349624 16.971411 17.369297 18.335817
min 0.000000 16.000000 0.000000e+00 1000.000000 5.000000 2.000000 4.000000 7.000000 4.000000 4.000000 ... 5.000000 12.000000 3.000000 2.000000 3.000000 1.000000 1.000000 1.000000 1.000000 1.000000
25% 3357.000000 21.000000 2.500000e+05 1000.000000 35.000000 28.000000 43.000000 50.000000 28.000000 45.000000 ... 37.000000 49.000000 29.000000 25.000000 23.000000 8.000000 8.000000 8.000000 8.000000 8.000000
50% 6622.000000 24.000000 5.000000e+05 2000.000000 51.000000 45.000000 54.000000 60.000000 41.000000 58.000000 ... 47.000000 56.000000 51.000000 54.000000 51.000000 11.000000 11.000000 11.000000 11.000000 11.000000
75% 9876.000000 28.000000 8.500000e+05 4000.000000 61.000000 59.000000 62.000000 65.000000 53.000000 65.000000 ... 58.000000 63.000000 62.000000 64.000000 62.000000 14.000000 14.000000 14.000000 14.000000 14.000000
max 13125.000000 45.000000 1.185000e+08 565000.000000 93.000000 95.000000 94.000000 93.000000 90.000000 97.000000 ... 91.000000 96.000000 93.000000 93.000000 91.000000 90.000000 92.000000 91.000000 90.000000 94.000000

8 rows × 38 columns

Здесь для каждого числового (int64) столбца показано число непустых значений (count), среднее (mean), стандартное отклонение (std), минимум и максимум (min и max), 25% и 75% квартили и медиана (50%).

Чтобы посмотреть статистику по нечисловым признакам (например, по строчным (object) или булевым (bool) данным), нужно явно указать интересующие нас типы в параметре include метода describe:

football.describe(include=['object'])
Name Nationality Club Position
count 12897 12897 12897 12897
unique 12326 156 650 27
top J. Rodríguez England V-Varen Nagasaki GK
freq 9 1368 30 1641

Здесь для каждой колонки с типом object (строчные данные) выводится количество непустых строк, уникальных значений, самое частое значение (top) и частота этого значения (freq).

Для вычисления отдельных статистических параметров DataFrame можно использовать не только метод .describe(), но и отдельные методы для каждого параметра:

Метод Статистический параметр
.max() Максимум
.min() Минимум
.mean() Среднее значение
.sum() Сумма
.count() Количество непустых элементов
.std() Стандартное отклонение

Если один из этих методов применить ко всему DataFrame, то в результате его работы будет получен объект типа Series. В случае применения метода к отдельному столбцу, результатом вычислений станет число (среднее значение элементов столбца, минимум, максимум и т.п.).

В каждый метод можно передать некоторые параметры, среди которых:

Пример применения:

df = pd.DataFrame([[i, i + 1.2, i + 2, 'hi'] for i in range(10)],
                  columns=['foo', 'bar', 'baz', 'foobar'])
df
foo bar baz foobar
0 0 1.2 2 hi
1 1 2.2 3 hi
2 2 3.2 4 hi
3 3 4.2 5 hi
4 4 5.2 6 hi
5 5 6.2 7 hi
6 6 7.2 8 hi
7 7 8.2 9 hi
8 8 9.2 10 hi
9 9 10.2 11 hi
df.mean()

Здесь вычисляется среднее по столбцам (так как не передан параметр axis), причем только по числовым столбцам, так как метод .mean() не может применяться к столбцам с другим типом.

Доступ к колонке можно получить разными способами: df['column_name'] или df.column_name.

Например, так:

df = pd.DataFrame([[i, i + 1.2, i + 2, 'hi'] for i in range(10)],
                  columns=['foo', 'bar', 'baz', 'foobar'])
df['foo']
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
Name: foo, dtype: int64
df.foo
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
Name: foo, dtype: int64

Как мы помним, колонки в DataFrame представляют собой Series, поэтому к ним можно применять методы .max(), .std() и другие.

df = pd.DataFrame([[i, i + 1.2, i + 2, 'hi'] for i in range(10)],
                  columns=['foo', 'bar', 'baz', 'foobar'])
df.bar.mean()
5.7

Для следующего блока задач потребуется открыть уже известный набор данных о футболистах.

Задание 1

Чему равен средний возраст (Age), футболистов в наборе данных, округлённый до целого?

Задание 2

Каково количество непустых строк в колонке Composure (Хладнокровие) набора данных о футболистах?

Задание 3

Каково в наборе данных о футболистах стандартное отклонение параметра коротких пасов (ShortPassing), округлённое до второго знака после запятой?

Задание 4

Какова сумма заработных плат за год (Wage) в наборе данных о футболистах?

Задание 5

Какова минимальная стоимость футболиста (Value) в наборе данных о футболистах?

Часто возникает необходимость выбрать данные из DataFrame по определённому условию. Например, если в уже известном нам наборе данных о футболистах мы хотим выбрать только тех, у кого возраст больше 20 лет, используется следующий код:

import pandas as pd

url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/data/football.csv"
football = pd.read_csv(url)
football[football.Age > 20]
Unnamed: 0 Name Age Nationality Club Value Wage Position Crossing Finishing ... Penalties Composure Marking StandingTackle SlidingTackle GKDiving GKHandling GKKicking GKPositioning GKReflexes
0 0 L. Messi 31 Argentina FC Barcelona 110500000 565000 RF 84 95 ... 75 96 33 28 26 6 11 15 14 8
1 1 Cristiano Ronaldo 33 Portugal Juventus 77000000 405000 ST 84 94 ... 85 95 28 31 23 7 11 15 14 11
2 2 Neymar Jr 26 Brazil Paris Saint-Germain 118500000 290000 LW 79 87 ... 81 94 27 24 33 9 9 15 15 11
3 3 De Gea 27 Spain Manchester United 72000000 260000 GK 17 13 ... 40 68 15 21 13 90 85 87 88 94
4 4 K. De Bruyne 27 Belgium Manchester City 102000000 355000 RCM 93 82 ... 79 88 68 58 51 15 13 5 10 13
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
12838 13067 D. Mackay 21 Scotland Kilmarnock 30000 1000 GK 14 20 ... 24 30 12 18 18 48 50 47 48 48
12857 13086 Wu Lei 21 China PR Tianjin Quanjian FC 9000000 2000 LDM 52 29 ... 46 39 52 40 49 8 15 11 8 5
12861 13090 Y. Uchimura 33 Japan Hokkaido Consadole Sapporo 20000 1000 CAM 51 31 ... 33 62 45 48 42 13 15 7 15 15
12870 13099 M. Hurst 22 Scotland St. Johnstone FC 40000 1000 GK 19 15 ... 29 28 12 15 16 45 49 50 50 45
12873 13102 K. Pilkington 44 England Cambridge United 0 1000 GK 11 12 ... 22 56 15 15 13 45 48 44 49 46

10025 rows × 42 columns

Синтаксис этой конструкции достаточно прост. Внутри квадратных скобок передается список из True или False, который показывает, какие строки DataFrame нужно оставить, а какие убрать. Этот список генерируется сравнением Series football.Age с 20.

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

football[football.Age > football.Age.mean()]
Unnamed: 0 Name Age Nationality Club Value Wage Position Crossing Finishing ... Penalties Composure Marking StandingTackle SlidingTackle GKDiving GKHandling GKKicking GKPositioning GKReflexes
0 0 L. Messi 31 Argentina FC Barcelona 110500000 565000 RF 84 95 ... 75 96 33 28 26 6 11 15 14 8
1 1 Cristiano Ronaldo 33 Portugal Juventus 77000000 405000 ST 84 94 ... 85 95 28 31 23 7 11 15 14 11
2 2 Neymar Jr 26 Brazil Paris Saint-Germain 118500000 290000 LW 79 87 ... 81 94 27 24 33 9 9 15 15 11
3 3 De Gea 27 Spain Manchester United 72000000 260000 GK 17 13 ... 40 68 15 21 13 90 85 87 88 94
4 4 K. De Bruyne 27 Belgium Manchester City 102000000 355000 RCM 93 82 ... 79 88 68 58 51 15 13 5 10 13
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
12746 12975 Teng Shangkun 27 China PR Tianjin TEDA FC 20000 1000 GK 10 8 ... 17 58 28 10 13 46 56 55 45 53
12749 12978 M. Mansour 26 Saudi Arabia Al Batin 30000 2000 LB 36 18 ... 33 37 45 54 54 10 8 6 13 13
12767 12996 Sun Qibin 26 China PR Tianjin Quanjian FC 20000 2000 GK 14 7 ... 12 30 46 11 10 50 46 51 48 50
12861 13090 Y. Uchimura 33 Japan Hokkaido Consadole Sapporo 20000 1000 CAM 51 31 ... 33 62 45 48 42 13 15 7 15 15
12873 13102 K. Pilkington 44 England Cambridge United 0 1000 GK 11 12 ... 22 56 15 15 13 45 48 44 49 46

6191 rows × 42 columns

Условия можно и комбинировать, используя операторы & (логическое и) и | (логическое или). Условия при этом заключаются в скобки. Например, если мы хотим получить только тех футболистов, у которых возраст меньше среднего, или игроков 'FC Barcelona':

football[(football.Age < football.Age.mean())|
         (football.Club == 'FC Barcelona')]
Unnamed: 0 Name Age Nationality Club Value Wage Position Crossing Finishing ... Penalties Composure Marking StandingTackle SlidingTackle GKDiving GKHandling GKKicking GKPositioning GKReflexes
0 0 L. Messi 31 Argentina FC Barcelona 110500000 565000 RF 84 95 ... 75 96 33 28 26 6 11 15 14 8
7 7 L. Suárez 31 Uruguay FC Barcelona 80000000 455000 RS 77 93 ... 85 85 62 45 38 27 25 31 33 37
15 15 P. Dybala 24 Argentina Juventus 89000000 205000 LF 82 84 ... 86 84 23 20 20 5 4 4 5 8
16 16 H. Kane 24 England Tottenham Hotspur 83500000 205000 ST 75 94 ... 90 89 56 36 38 8 10 11 14 11
18 18 M. ter Stegen 26 Germany FC Barcelona 58000000 240000 GK 15 14 ... 25 69 25 13 10 87 85 88 85 90
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
12892 13121 J. Lundstram 19 England Crewe Alexandra 1100000 1000 CM 34 38 ... 43 45 40 48 47 10 13 7 8 9
12893 13122 N. Christoffersson 19 Sweden Trelleborgs FF 60000 1000 ST 23 52 ... 43 42 22 15 19 10 9 9 5 12
12894 13123 B. Worman 16 England Cambridge United 60000 1000 ST 25 40 ... 55 41 32 13 11 6 5 10 6 13
12895 13124 D. Walker-Rice 17 England Tranmere Rovers 60000 1000 RW 44 50 ... 50 46 20 25 27 14 6 14 8 9
12896 13125 G. Nugent 16 England Tranmere Rovers 60000 1000 CM 41 34 ... 33 43 40 43 50 10 15 9 12 9

6717 rows × 42 columns

Статистические параметры можно посчитать и по отфильтрованному DataFrame, например среднюю заработную плату футболистов с возрастом меньше среднего и из 'FC Barcelona':

football[(football.Age < football.Age.mean())&
         (football.Club == 'FC Barcelona')].Wage.mean()
77454.54545454546

Здесь мы получили среднюю заработную плату за год футболистов с возрастом ниже среднего или из клуба FC Barcelona.

Задание 6

Какова средняя скорость (SprintSpeed) футболистов, зарплата (Wage) которых выше среднего? Ответ округлите до сотых.

Задание 7

Какова средняя скорость (SprintSpeed) футболистов, зарплата (Wage) которых ниже среднего? Ответ округлите до сотых.

Задание 8

Какую позицию (Position) занимает футболист с самой высокой зарплатой (Wage)?

Задание 9

Сколько пенальти (Penalties) забили бразильские (Nationality, Brazil) футболисты за период, данные о котором представлены в датасете?

Задание 10

Укажите средний возраст (Age) игроков, у которых точность удара головой (HeadingAccuracy) > 50. Ответ округлите до сотых.

Задание 11

Укажите возраст (Age) самого молодого игрока, у которого хладнокровие (Composure) и реакция (Reactions) превышают 90% от максимального значения, представленного в датасете.

Задание 12

Определите, насколько средняя реакция (Reactions) самых взрослых игроков (т.е. игроков, чей возраст (Age) равен максимальному) больше средней реакции самых молодых игроков. Ответ округлите до сотых.

Задание 13

Из какой страны (Nationality) происходит больше всего игроков, чья стоимость (Value) превышает среднее значение?

Задание 14

Определите, во сколько раз средняя зарплата (Wage) голкипера (Position, GK) с максимальным значением показателя “Рефлексы” (GKReflexes) выше средней зарплаты голкипера с максимальным значением показателя “Владение мячом” (GKHandling). Ответ округлите до сотых.

Задание 15

Определите, во сколько раз средняя сила удара (ShotPower) самых агрессивных игроков (игроков с максимальным значением показателя “Агрессивность” (Aggression)) выше силы удара игроков с минимальной агрессией. Ответ округлите до сотых.