In [1]: import pandas as pd
Данные, используемые в этом руководстве:
  • Этот учебник использует набор данных Titanic, сохраненный как CSV. Данные состоят из следующих столбцов данных:

    • PassengerId: Идентификатор каждого пассажира.

    • Выжил: Указание, выжил ли пассажир. 0 для да и 1 для нет.

    • Pclass: Один из 3 классов билетов: Класс 1, Класс 2 и Класс 3.

    • Name: Имя пассажира.

    • Sex: Пол пассажира.

    • Age: Возраст пассажира в годах.

    • SibSp: Количество братьев, сестер или супругов на борту.

    • Parch: Количество родителей или детей на борту.

    • Ticket: Номер билета пассажира.

    • Fare: Указывает стоимость проезда.

    • Cabin: Номер каюты пассажира.

    • Embarked: Порт посадки.

    К исходным данным
    In [2]: titanic = pd.read_csv("data/titanic.csv")
    
    In [3]: titanic.head()
    Out[3]: 
       PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
    0            1         0       3  ...   7.2500   NaN         S
    1            2         1       1  ...  71.2833   C85         C
    2            3         1       3  ...   7.9250   NaN         S
    3            4         1       1  ...  53.1000  C123         S
    4            5         0       3  ...   8.0500   NaN         S
    
    [5 rows x 12 columns]
    

Как рассчитать сводную статистику#

Агрегирование статистики#

../../_images/06_aggregate.svg
  • Каков средний возраст пассажиров Титаника?

    In [4]: titanic["Age"].mean()
    Out[4]: 29.69911764705882
    

Для столбцов с числовыми данными доступны различные статистические показатели, которые можно применять. Операции обычно исключают пропущенные данные и по умолчанию выполняются по строкам.

../../_images/06_reduction.svg
  • Каков медианный возраст и цена билета пассажиров Титаника?

    In [5]: titanic[["Age", "Fare"]].median()
    Out[5]: 
    Age     28.0000
    Fare    14.4542
    dtype: float64
    

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

Агрегирующая статистика может быть рассчитана для нескольких столбцов одновременно. Помните, что describe функция из первое руководство?

In [6]: titanic[["Age", "Fare"]].describe()
Out[6]: 
              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() method:

In [7]: titanic.agg(
   ...:     {
   ...:         "Age": ["min", "max", "median", "skew"],
   ...:         "Fare": ["min", "max", "median", "mean"],
   ...:     }
   ...: )
   ...: 
Out[7]: 
              Age        Fare
min      0.420000    0.000000
max     80.000000  512.329200
median  28.000000   14.454200
skew     0.389108         NaN
mean          NaN   32.204208
К руководству пользователя

Подробности о описательной статистике приведены в разделе руководства пользователя описательная статистика.

Агрегирование статистики, сгруппированной по категориям#

../../_images/06_groupby.svg
  • Каков средний возраст пассажиров Титаника мужского и женского пола?

    In [8]: titanic[["Sex", "Age"]].groupby("Sex").mean()
    Out[8]: 
                  Age
    Sex              
    female  27.915709
    male    30.726645
    

    Поскольку нас интересует средний возраст для каждого пола, сначала выполняется выборка по этим двум столбцам: titanic[["Sex", "Age"]]. Далее, groupby() метод применяется к Sex столбец для создания группы на категорию. Средний возраст для каждого пола вычисляется и возвращается.

Вычисление заданной статистики (например, mean возраст) для каждой категории в столбце (например, мужской/женский в Sex столбец) является распространенным шаблоном. groupby метод используется для поддержки этого типа операций. Это вписывается в более общий split-apply-combine шаблон:

  • Split данные на группы

  • Apply функцию к каждой группе независимо

  • Объединить результаты в структуру данных

Шаги apply и combine обычно выполняются вместе в pandas.

В предыдущем примере мы явно выбрали сначала 2 столбца. Если нет, mean метод применяется к каждому столбцу, содержащему числовые столбцы, путем передачи numeric_only=True:

In [9]: titanic.groupby("Sex").mean(numeric_only=True)
Out[9]: 
        PassengerId  Survived    Pclass  ...     SibSp     Parch       Fare
Sex                                      ...                               
female   431.028662  0.742038  2.159236  ...  0.694268  0.649682  44.479818
male     454.147314  0.188908  2.389948  ...  0.429809  0.235702  25.523893

[2 rows x 7 columns]

Не имеет особого смысла вычислять среднее значение для Pclass. Если нас интересует только средний возраст для каждого пола, выбор столбцов (квадратные скобки [] как обычно) также поддерживается на сгруппированных данных:

In [10]: titanic.groupby("Sex")["Age"].mean()
Out[10]: 
Sex
female    27.915709
male      30.726645
Name: Age, dtype: float64
../../_images/06_groupby_select_detail.svg

Примечание

The Pclass столбец содержит числовые данные, но фактически представляет 3 категории (или факторы) с метками '1', '2' и '3'. Вычисление статистики по ним не имеет особого смысла. Поэтому pandas предоставляет Categorical тип данных для обработки этого типа данных. Дополнительная информация предоставлена в руководстве пользователя Категориальные данные раздел.

  • Какова средняя цена билета для каждой комбинации пола и класса каюты?

    In [11]: titanic.groupby(["Sex", "Pclass"])["Fare"].mean()
    Out[11]: 
    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() метод.

К руководству пользователя

Полное описание подхода split-apply-combine приведено в разделе руководства пользователя о операции groupby.

Подсчитать количество записей по категориям#

../../_images/06_valuecounts.svg
  • Каково количество пассажиров в каждом из классов кают?

    In [12]: titanic["Pclass"].value_counts()
    Out[12]: 
    Pclass
    3    491
    1    216
    2    184
    Name: count, dtype: int64
    

    The value_counts() метод подсчитывает количество записей для каждой категории в столбце.

Эта функция является сокращением, так как фактически представляет собой операцию группировки в сочетании с подсчётом количества записей в каждой группе:

In [13]: titanic.groupby("Pclass")["Pclass"].count()
Out[13]: 
Pclass
1    216
2    184
3    491
Name: Pclass, dtype: int64

Примечание

Оба size и count может использоваться в сочетании с groupby. В то время как size includes NaN значения и просто предоставляет количество строк (размер таблицы), count исключает пропущенные значения. В value_counts метод, используйте dropna аргумент для включения или исключения NaN значения.

К руководству пользователя

В руководстве пользователя есть специальный раздел о value_counts , см. страницу дискретизация.

ПОМНИТЕ

  • Статистика агрегации может быть рассчитана по целым столбцам или строкам.

  • groupby обеспечивает возможности разделение-применение-объединение шаблон.

  • value_counts является удобным сокращением для подсчёта количества записей в каждой категории переменной.

К руководству пользователя

Полное описание подхода split-apply-combine приведено в руководстве пользователя на страницах о операции groupby.