In [1]: import pandas as pd
Data used for this tutorial:
  • 本教程使用存储为CSV的泰坦尼克号数据集。数据由以下数据列组成:

    • PassengerID:每个乘客的ID。

    • 生还:表示乘客是否生还。 0 是的而且 1 不是的。

    • Pclass:3个票类中的一个:类 1 ,班级 2 和班级 3

    • 姓名:乘客姓名。

    • 性别:乘客性别。

    • 年龄:乘客的年龄,以年为单位。

    • SibSp:船上兄弟姐妹或配偶的数量。

    • Parch:船上父母或孩子的人数。

    • 车票:旅客车票号码。

    • 票价:标明票价。

    • 客舱:客舱人数。

    • 已装船:装船港。

    To raw data
    In [2]: titanic = pd.read_csv("data/titanic.csv")
    
    In [3]: titanic.head()
    Out[3]: 
       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
    

如何计算汇总统计?#

汇总统计信息#

../../_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 ,请参阅 subset data tutorial )是为每个数值列计算的。

可以同时计算多个列的聚合统计信息。请记住 describe 函数从 first tutorial

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() 方法:

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
To user guide

上的用户指南部分提供了有关描述性统计的详细信息 descriptive statistics

汇总按类别分组的统计信息#

../../_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 图案:

  • 拆分 将数据分组

  • 应用 独立于每一组的函数

  • 联合收割机 将结果转换为数据结构

在Pandas身上,应用和组合步骤通常是一起完成的。

在上一个示例中,我们首先显式选择了两个柱。如果不是,则 mean 方法应用于包含数字列的每一列:

In [9]: titanic.groupby("Sex").mean()
Out[9]: 
        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 。如果我们只对每个性别的平均年龄感兴趣,列的选择(矩形括号 [] 像往常一样)也支持分组的数据:

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

备注

这个 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() 方法。

To user guide

上的用户指南部分提供了有关拆分-应用-合并方法的完整描述 groupby operations

按类别统计记录数#

../../_images/06_valuecounts.svg
  • 每个舱位的乘客人数是多少?

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

    这个 value_counts() 方法计算列中每个类别的记录数。

该函数是一种快捷方式,因为它实际上是一个GROUP BY操作,并结合计算每个组中的记录数:

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

备注

两者都有 sizecount 可以与组合使用 groupby 。鉴于 size 包括 NaN 值,并只提供行数(表的大小), count 排除缺少的值。在 value_counts 方法,请使用 dropna 参数来包括或排除 NaN 价值。

To user guide

用户指南中有专门的部分介绍 value_counts ,请参阅上的页面 discretization

REMEMBER

  • 可以对整列或整行计算聚合统计信息。

  • groupby 提供功能强大的 split-apply-combine 图案。

  • value_counts 是统计变量每一类别中的条目数量的便捷快捷方式。

To user guide

有关拆分-应用-合并方法的完整说明,请参阅关于 groupby operations