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

    • PassengerId:每位乘客的 ID。

    • Survived:表示乘客是否幸存。0对于是和1否。

    • Pclass:3 个票价类别之一: Class 1、 Class2和 Class 3

    • 姓名:乘客姓名。

    • 性别:乘客的性别。

    • 年龄:乘客的年龄(岁)。

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

    • Parch:船上父母或儿童的数量。

    • 票号:旅客的票号。

    • 票价:表示票价。

    • 客舱:乘客的客舱编号。

    • 登船:登船港口。

    至原始数据
    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
    

    针对每个数字列计算应用于 a 的多列的统计量DataFrame(选择两列返回 a 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()方法定义给定列的聚合统计信息的特定组合,而不是预定义的统计信息:

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年龄)是一种常见模式。该方法用于支持此类操作。这符合更一般的模式:Sexgroupbysplit-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

笔记

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

转至用户指南

有关groupby 操作的用户指南部分提供了有关拆分-应用-组合方法的完整说明。

按类别统计记录数#

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

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

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

该函数是一个快捷方式,因为它实际上是一个 groupby 操作,并结合了每组内记录数的计数:

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

笔记

size和两者都count可以与 结合使用 groupby。而size包含NaN值并仅提供行数(表的大小),则count排除缺失值。在该value_counts方法中,使用dropna参数来包含或排除NaN值。

转至用户指南

用户指南有专门的部分,请参阅离散化value_counts页面。

记住

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

  • groupby提供拆分-应用-组合模式的强大功能。

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

转至用户指南

有关groupby 操作的用户指南页面中提供了有关 split-apply-combine 方法的完整说明。