import pandas as pd
url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5%20%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20pandas/data/titanic.csv"
titanic = pd.read_csv(url)
titanic
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.0000 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.0000 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.4500 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.0000 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.7500 | NaN | Q |
891 rows × 12 columns
Каков средний возраст пассажиров?
titanic["Age"].mean()
29.69911764705882
В pandas
доступны различные статистические данные, которые могут быть применены к столбцам с числовыми значениями.
Операции исключают отсутствующие данные и по умолчанию работают со строками в таблице.
Каков средний возраст и стоимость билета для пассажиров?
titanic[["Age", "Fare"]].median()
Age 28.0000 Fare 14.4542 dtype: float64
Статистика, примененная к нескольким столбцам DataFrame
, рассчитывается для каждого из числовых столбцов.
Агрегирующая статистика может быть рассчитана для нескольких столбцов одновременно:
titanic[["Age", "Fare"]].describe()
Age | Fare | |
---|---|---|
count | 714.000000 | 891.000000 |
mean | 29.699118 | 32.204208 |
std | 14.526497 | 49.693429 |
min | 0.420000 | 0.000000 |
25% | 20.125000 | 7.910400 |
50% | 28.000000 | 14.454200 |
75% | 38.000000 | 31.000000 |
max | 80.000000 | 512.329200 |
С помощью метода DataFrame.agg()
могут быть определены комбинации статистики для заданных столбцов:
titanic.agg({'Age': ['min', 'max', 'median', 'skew'],
'Fare': ['min', 'max', 'median', 'mean']})
Age | Fare | |
---|---|---|
max | 80.000000 | 512.329200 |
mean | NaN | 32.204208 |
median | 28.000000 | 14.454200 |
min | 0.420000 | 0.000000 |
skew | 0.389108 | NaN |
Подробная информация об описательной статистике представлена в разделе руководства пользователя по описательной статистике.
Каков средний возраст мужчин и женщин пассажиров?
titanic[["Sex", "Age"]].groupby("Sex").mean()
Age | |
---|---|
Sex | |
female | 27.915709 |
male | 30.726645 |
Поскольку интерес представляет средний возраст для каждого пола, сначала делается выборка по этим двум столбцам: titanic[["Sex", "Age"]]
.
Затем метод groupby()
применяется к столбцу Sex
для создания группы по категориям.
Затем рассчитывается и возвращается средний возраст для каждого пола.
Вычисление заданной статистики (например, mean
для возраста) для каждой категории в столбце (например, male
/female
в столбце Sex
) является обычной моделью. Метод groupby
используется для поддержки этого типа операций. В более общем плане это соответствует схеме split-apply-combine
:
Этапы применения и объединения обычно выполняются в pandas
вместе.
В предыдущем примере мы сначала явно выбрали 2
столбца. Если нет, то метод mean
применяется к каждому столбцу, содержащему числа:
titanic.groupby("Sex").mean()
PassengerId | Survived | Pclass | Age | SibSp | Parch | Fare | |
---|---|---|---|---|---|---|---|
Sex | |||||||
female | 431.028662 | 0.742038 | 2.159236 | 27.915709 | 0.694268 | 0.649682 | 44.479818 |
male | 454.147314 | 0.188908 | 2.389948 | 30.726645 | 0.429809 | 0.235702 | 25.523893 |
Не имеет смысла получать среднее значение для столбца Pclass
(тип каюты).
Если нас интересует только средний возраст для каждого пола, то выбор столбцов поддерживается и для сгруппированных данных:
titanic.groupby("Sex")["Age"].mean()
Sex female 27.915709 male 30.726645 Name: Age, dtype: float64
Столбец Pclass
содержит числовые данные, но на самом деле представляет собой 3
категории (или фактора), соответственно метки "1"
, "2"
и "3"
. Расчет статистики по ним не имеет большого смысла.
pandas
предоставляет тип данных Categorical
для обработки подобных значений. Более подробная информация представлена в руководстве пользователя в разделе Категориальные данные.
Какова средняя цена билета для каждой комбинации пола и типа каюты?
titanic.groupby(["Sex", "Pclass"])["Fare"].mean()
Sex Pclass female 1 106.125798 2 21.970121 3 16.118810 male 1 67.226127 2 19.741782 3 12.661633 Name: Fare, dtype: float64
Группировка может выполняться по нескольким столбцам одновременно. Укажите имена столбцов в виде списка для метода groupby()
.
Полное описание подхода разделения-применения-объединения приведено в разделе руководства пользователя по групповым операциям.
Какое количество пассажиров в каждом из типов кают?
titanic["Pclass"].value_counts()
3 491 1 216 2 184 Name: Pclass, dtype: int64
Метод value_counts()
подсчитывает количество записей для каждой категории в колонке.
На самом деле, за этой функцией скрывается групповая операция в сочетании с подсчетом количества записей в каждой группе:
titanic.groupby("Pclass")["Pclass"].count()
Pclass 1 216 2 184 3 491 Name: Pclass, dtype: int64
В сочетании с groupby
могут быть использованы size
и count
.
В то время как size
включает в себя NaN
значения и просто предоставляет количество строк (размер таблицы), count
исключает отсутствующие значения.
В методе value_counts
используйте dropna
аргумент для включения или исключения NaN
значений.
В руководстве пользователя есть специальный раздел value_counts
, см. документацию.
Полное описание подхода разделения-применения-объединения
приведено на страницах руководства пользователя по групповым операциям.