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] 如何计算汇总统计数据# 汇总统计数据# 泰坦尼克号乘客的平均年龄是多少? In [4]: titanic["Age"].mean() Out[4]: 29.69911764705882 可以使用不同的统计数据,并将其应用于具有数值数据的列。一般情况下,操作会排除缺失数据并默认跨行操作。 泰坦尼克号乘客的平均年龄和票价是多少? 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 转至用户指南用户指南的描述性统计部分提供了有关描述性统计的详细信息。 聚合按类别分组的统计数据# 泰坦尼克号男性乘客和女性乘客的平均年龄是多少? 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 笔记 该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 操作的用户指南部分提供了有关拆分-应用-组合方法的完整说明。 按类别统计记录数# 各舱位的乘客人数是多少? 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 方法的完整说明。